Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > a47f0719970f9f829128f311a437816d > files > 303

ghc-ForSyDe-devel-3.1.1-4.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>src/ForSyDe/Backend/VHDL/AST.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      :  ForSyDe.Backend.VHDL.AST</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   :  (c) SAM Group, KTH/ICT/ECS 2007-2008</span>
<a name="line-5"></a><span class='hs-comment'>-- License     :  BSD-style (see the file LICENSE)</span>
<a name="line-6"></a><span class='hs-comment'>-- </span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer  :  forsyde-dev@ict.kth.se</span>
<a name="line-8"></a><span class='hs-comment'>-- Stability   :  experimental</span>
<a name="line-9"></a><span class='hs-comment'>-- Portability :  non-portable (Template Haskell)</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- A VHDL 93 subset AST (Abstract Syntax Tree), coded so that it can be easy </span>
<a name="line-12"></a><span class='hs-comment'>-- to extend, please see doc/VHDL/vhdl93-syntax.html as reference </span>
<a name="line-13"></a><span class='hs-comment'>-- in order to extend it (this AST is based on that grammar)</span>
<a name="line-14"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-15"></a>
<a name="line-16"></a><span class='hs-comment'>-- This AST is aimed at code generation not parsing, and thus, </span>
<a name="line-17"></a><span class='hs-comment'>-- it was simplified</span>
<a name="line-18"></a><span class='hs-comment'>-- The incompatibilities or simplifications from the standard</span>
<a name="line-19"></a><span class='hs-comment'>-- are properly commented</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-comment'>-- FIXME: shouldn't be records used instead of bare algebraic types?</span>
<a name="line-22"></a><span class='hs-comment'>-- FIXME: shouldn't the unused type redefinitions be removed?</span>
<a name="line-23"></a><span class='hs-comment'>-- FIXME: It would maybe be a good idea to create a sequence ADT which</span>
<a name="line-24"></a><span class='hs-comment'>--        guaranteed to hold at least one element (i.e. the grammar</span>
<a name="line-25"></a><span class='hs-comment'>--        has some cases such as "choices ::= choice | {choice}"</span>
<a name="line-26"></a><span class='hs-comment'>--        which are not well represented as "[Choice]", </span>
<a name="line-27"></a><span class='hs-comment'>--        "Choices Choice  (Maybe [Choice])" is not easy to handle either</span>
<a name="line-28"></a><span class='hs-comment'>--        and thus, it was discarded.</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>ForSyDe</span><span class='hs-varop'>.</span><span class='hs-conid'>Backend</span><span class='hs-varop'>.</span><span class='hs-conid'>VHDL</span><span class='hs-varop'>.</span><span class='hs-conid'>AST</span> <span class='hs-keyword'>where</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span> <span class='hs-layout'>(</span><span class='hs-varid'>toLower</span><span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Regex</span><span class='hs-varop'>.</span><span class='hs-conid'>Posix</span>
<a name="line-34"></a>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ForSyDe</span><span class='hs-varop'>.</span><span class='hs-conid'>ForSyDeErr</span>
<a name="line-36"></a>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-comment'>--------------------</span>
<a name="line-39"></a><span class='hs-comment'>-- VHDL identifiers</span>
<a name="line-40"></a><span class='hs-comment'>--------------------</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="VHDLId"></a><span class='hs-comment'>-- VHDL identifier, use mkVHDLId to create it from a String, </span>
<a name="line-43"></a><a name="VHDLId"></a><span class='hs-comment'>-- making sure a string is a proper VHDL identifier</span>
<a name="line-44"></a><a name="VHDLId"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Basic</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Extended</span> <span class='hs-conid'>String</span>
<a name="line-45"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Eq</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="fromVHDLId"></a><span class='hs-comment'>-- | Obtain the String of a VHDL identifier</span>
<a name="line-48"></a><span class='hs-definition'>fromVHDLId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-49"></a><span class='hs-definition'>fromVHDLId</span> <span class='hs-layout'>(</span><span class='hs-conid'>Basic</span>    <span class='hs-varid'>str</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>str</span>
<a name="line-50"></a><span class='hs-definition'>fromVHDLId</span> <span class='hs-layout'>(</span><span class='hs-conid'>Extended</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-chr'>'\\'</span> <span class='hs-conop'>:</span>  <span class='hs-layout'>(</span><span class='hs-varid'>escapeBackslashes</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-str'>"\\"</span>
<a name="line-51"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>escapeBackslashes</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-52"></a>       <span class='hs-varid'>escapeBackslashes</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-conop'>:</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> 
<a name="line-53"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\\'</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"\\\\"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>escapeBackslashes</span> <span class='hs-varid'>xs</span>
<a name="line-54"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-conop'>:</span> <span class='hs-varid'>escapeBackslashes</span> <span class='hs-varid'>xs</span>
<a name="line-55"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyword'>where</span>
<a name="line-56"></a> <span class='hs-varid'>show</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span><span class='hs-varop'>.</span><span class='hs-varid'>fromVHDLId</span>
<a name="line-57"></a>
<a name="line-58"></a>
<a name="line-59"></a><a name="unsafeVHDLBasicId"></a><span class='hs-comment'>-- | unsafely create a basic VHDLId (without cheking if the string is correct)</span>
<a name="line-60"></a><span class='hs-definition'>unsafeVHDLBasicId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VHDLId</span>
<a name="line-61"></a><span class='hs-definition'>unsafeVHDLBasicId</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Basic</span> <span class='hs-varid'>str</span>
<a name="line-62"></a>
<a name="line-63"></a>
<a name="line-64"></a><a name="unsafeVHDLExtId"></a><span class='hs-comment'>-- | unsafely create an exteded VHDLId (without cheking if the string is </span>
<a name="line-65"></a><span class='hs-comment'>--   correct)</span>
<a name="line-66"></a><span class='hs-definition'>unsafeVHDLExtId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VHDLId</span>
<a name="line-67"></a><span class='hs-definition'>unsafeVHDLExtId</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Extended</span> <span class='hs-varid'>str</span>
<a name="line-68"></a>
<a name="line-69"></a>
<a name="line-70"></a><a name="mkVHDLBasicId"></a><span class='hs-comment'>-- | Create a VHDL basic identifier from a String, previously checking if the  </span>
<a name="line-71"></a><span class='hs-comment'>--   String is correct</span>
<a name="line-72"></a><span class='hs-definition'>mkVHDLBasicId</span> <span class='hs-keyglyph'>::</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EProne</span> <span class='hs-conid'>VHDLId</span>
<a name="line-73"></a><span class='hs-comment'>-- FIXME: we relax the fact that two consecutive underlines </span>
<a name="line-74"></a><span class='hs-comment'>--        are not allowed</span>
<a name="line-75"></a><span class='hs-definition'>mkVHDLBasicId</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwError</span> <span class='hs-conid'>EmptyVHDLId</span>
<a name="line-76"></a><span class='hs-definition'>mkVHDLBasicId</span> <span class='hs-varid'>id</span>
<a name="line-77"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>id</span> <span class='hs-varop'>=~</span> <span class='hs-varid'>basiIdPat</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>$</span> <span class='hs-varid'>elem</span> <span class='hs-varid'>lowId</span> <span class='hs-varid'>reservedWords</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Basic</span> <span class='hs-varid'>id</span>
<a name="line-78"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwError</span> <span class='hs-varop'>$</span> <span class='hs-conid'>IncVHDLBasId</span> <span class='hs-varid'>id</span>
<a name="line-79"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>lowId</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>toLower</span> <span class='hs-varid'>id</span>
<a name="line-80"></a>       <span class='hs-varid'>basiIdPat</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"^[A-Za-z](_?[A-Za-z0-9])*$"</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="mkVHDLExtId"></a><span class='hs-comment'>-- | Create a VHDL extended identifier from a String, previously checking </span>
<a name="line-83"></a><span class='hs-comment'>--   if the String is correct. The input string must not include the initial</span>
<a name="line-84"></a><span class='hs-comment'>--   and ending backslashes nad the intermediate backslashes shouldn't be escaped.</span>
<a name="line-85"></a><span class='hs-definition'>mkVHDLExtId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EProne</span> <span class='hs-conid'>VHDLId</span>
<a name="line-86"></a><span class='hs-definition'>mkVHDLExtId</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwError</span> <span class='hs-conid'>EmptyVHDLId</span>
<a name="line-87"></a><span class='hs-definition'>mkVHDLExtId</span> <span class='hs-varid'>id</span>
<a name="line-88"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>id</span> <span class='hs-varop'>=~</span> <span class='hs-varid'>extIdPat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Extended</span> <span class='hs-varid'>id</span>
<a name="line-89"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwError</span> <span class='hs-varop'>$</span> <span class='hs-conid'>IncVHDLExtId</span> <span class='hs-varid'>id</span>
<a name="line-90"></a> <span class='hs-keyword'>where</span> <span class='hs-comment'>-- Regular expression pattern for extended identifiers.</span>
<a name="line-91"></a>       <span class='hs-comment'>-- According to the VHDL93 standard, an extended identifier must:</span>
<a name="line-92"></a>       <span class='hs-comment'>--  * Start and end with a backslash '\'</span>
<a name="line-93"></a>       <span class='hs-comment'>--  * Its middle characters can be</span>
<a name="line-94"></a>       <span class='hs-comment'>--    * two contiguous backslashes \\</span>
<a name="line-95"></a>       <span class='hs-comment'>--    * an alphanumeric (A-Za-z0-9)</span>
<a name="line-96"></a>       <span class='hs-comment'>--    * a Special Character </span>
<a name="line-97"></a>       <span class='hs-comment'>--    * an Other Special Character </span>
<a name="line-98"></a>       <span class='hs-comment'>--      (backslashes can only appear in pairs as indicated above)</span>
<a name="line-99"></a>       <span class='hs-comment'>-- </span>
<a name="line-100"></a>       <span class='hs-comment'>-- However, backslashes will be handled when printing the identifier,</span>
<a name="line-101"></a>       <span class='hs-comment'>-- (an initial and ending backslash are added and the intermediate backslashes</span>
<a name="line-102"></a>       <span class='hs-comment'>--  are escaped)</span>
<a name="line-103"></a>       <span class='hs-comment'>--</span>
<a name="line-104"></a>       <span class='hs-comment'>-- Note that we cannot use specialChars and otherSpecialChars</span>
<a name="line-105"></a>       <span class='hs-comment'>-- to build the pattern because of the double-backslash rule</span>
<a name="line-106"></a>       <span class='hs-comment'>-- and also, the right bracket (according to the posix</span>
<a name="line-107"></a>       <span class='hs-comment'>-- standard) needs to go in the first place of a bracket</span>
<a name="line-108"></a>       <span class='hs-comment'>-- expression to lose its special meaning.  Furthermore,</span>
<a name="line-109"></a>       <span class='hs-comment'>-- (according to the POSIX standard as well) we also need to put</span>
<a name="line-110"></a>       <span class='hs-comment'>-- '-' in the last place of the bracket expression.</span>
<a name="line-111"></a>   <span class='hs-varid'>extIdPat</span> <span class='hs-keyglyph'>=</span> 
<a name="line-112"></a>     <span class='hs-str'>"^[]A-Za-z0-9 \"#&amp;\\'()*+,./:;&lt;=&gt;_|!$%@?[^`{}~-]+$"</span>
<a name="line-113"></a>
<a name="line-114"></a>
<a name="line-115"></a><a name="unsafeIdAppend"></a><span class='hs-comment'>-- | Unsafely append a string to a VHDL identifier (i.e. without checking if</span>
<a name="line-116"></a><span class='hs-comment'>--  the resulting identifier is valid)</span>
<a name="line-117"></a><span class='hs-definition'>unsafeIdAppend</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VHDLId</span>
<a name="line-118"></a><span class='hs-definition'>unsafeIdAppend</span> <span class='hs-layout'>(</span><span class='hs-conid'>Basic</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>    <span class='hs-varid'>suffix</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Basic</span> <span class='hs-varop'>$</span> <span class='hs-varid'>id</span> <span class='hs-varop'>++</span> <span class='hs-varid'>suffix</span>
<a name="line-119"></a><span class='hs-definition'>unsafeIdAppend</span> <span class='hs-layout'>(</span><span class='hs-conid'>Extended</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-varid'>suffix</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Extended</span> <span class='hs-varop'>$</span> <span class='hs-varid'>id</span> <span class='hs-varop'>++</span> <span class='hs-varid'>suffix</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="specialChars"></a><span class='hs-comment'>-- | special characters as defined in the VHDL93 standard</span>
<a name="line-122"></a><span class='hs-definition'>specialChars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Char</span><span class='hs-keyglyph'>]</span>
<a name="line-123"></a><span class='hs-definition'>specialChars</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-chr'>'"'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'#'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'&amp;'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'\''</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'('</span> <span class='hs-layout'>,</span> <span class='hs-chr'>')'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'*'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'+'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>','</span><span class='hs-layout'>,</span>
<a name="line-124"></a>                <span class='hs-chr'>'-'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'.'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'/'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>':'</span>  <span class='hs-layout'>,</span> <span class='hs-chr'>';'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'&lt;'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'='</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'&gt;'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'_'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'|'</span><span class='hs-keyglyph'>]</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="otherSpecialChars"></a><span class='hs-comment'>-- | other special characters as defined in the VHDL93 standard</span>
<a name="line-127"></a><span class='hs-definition'>otherSpecialChars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Char</span><span class='hs-keyglyph'>]</span>
<a name="line-128"></a><span class='hs-definition'>otherSpecialChars</span> <span class='hs-keyglyph'>=</span><span class='hs-keyglyph'>[</span><span class='hs-chr'>'!'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'$'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'%'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'@'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'?'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'['</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'\\'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>']'</span><span class='hs-layout'>,</span>
<a name="line-129"></a>                    <span class='hs-chr'>'^'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'`'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'{'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'}'</span> <span class='hs-layout'>,</span> <span class='hs-chr'>'~'</span><span class='hs-keyglyph'>]</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="reservedWords"></a><span class='hs-comment'>-- | Reserved identifiers</span>
<a name="line-132"></a><span class='hs-definition'>reservedWords</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-133"></a><span class='hs-definition'>reservedWords</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"abs"</span><span class='hs-layout'>,</span> <span class='hs-str'>"access"</span><span class='hs-layout'>,</span> <span class='hs-str'>"after"</span><span class='hs-layout'>,</span> <span class='hs-str'>"alias"</span><span class='hs-layout'>,</span> <span class='hs-str'>"all"</span><span class='hs-layout'>,</span> <span class='hs-str'>"and"</span><span class='hs-layout'>,</span>
<a name="line-134"></a> <span class='hs-str'>"architecture"</span><span class='hs-layout'>,</span> <span class='hs-str'>"array"</span><span class='hs-layout'>,</span> <span class='hs-str'>"assert"</span><span class='hs-layout'>,</span> <span class='hs-str'>"attribute"</span><span class='hs-layout'>,</span> <span class='hs-str'>"begin"</span><span class='hs-layout'>,</span> <span class='hs-str'>"block"</span><span class='hs-layout'>,</span>
<a name="line-135"></a> <span class='hs-str'>"body"</span><span class='hs-layout'>,</span> <span class='hs-str'>"buffer"</span><span class='hs-layout'>,</span> <span class='hs-str'>"bus"</span><span class='hs-layout'>,</span> <span class='hs-str'>"case"</span><span class='hs-layout'>,</span> <span class='hs-str'>"component"</span><span class='hs-layout'>,</span> <span class='hs-str'>"configuration"</span><span class='hs-layout'>,</span>
<a name="line-136"></a> <span class='hs-str'>"constant"</span><span class='hs-layout'>,</span> <span class='hs-str'>"disconnect"</span><span class='hs-layout'>,</span> <span class='hs-str'>"downto"</span><span class='hs-layout'>,</span> <span class='hs-str'>"else"</span><span class='hs-layout'>,</span> <span class='hs-str'>"elsif"</span><span class='hs-layout'>,</span> <span class='hs-str'>"end"</span><span class='hs-layout'>,</span> <span class='hs-str'>"entity"</span><span class='hs-layout'>,</span>
<a name="line-137"></a> <span class='hs-str'>"exit"</span><span class='hs-layout'>,</span> <span class='hs-str'>"file"</span><span class='hs-layout'>,</span> <span class='hs-str'>"for"</span><span class='hs-layout'>,</span> <span class='hs-str'>"function"</span><span class='hs-layout'>,</span> <span class='hs-str'>"generate"</span><span class='hs-layout'>,</span> <span class='hs-str'>"generic"</span><span class='hs-layout'>,</span> <span class='hs-str'>"group"</span><span class='hs-layout'>,</span>
<a name="line-138"></a> <span class='hs-str'>"guarded"</span><span class='hs-layout'>,</span> <span class='hs-str'>"if"</span><span class='hs-layout'>,</span> <span class='hs-str'>"impure"</span><span class='hs-layout'>,</span> <span class='hs-str'>"in"</span><span class='hs-layout'>,</span> <span class='hs-str'>"inertial"</span><span class='hs-layout'>,</span> <span class='hs-str'>"inout"</span><span class='hs-layout'>,</span> <span class='hs-str'>"is"</span><span class='hs-layout'>,</span> <span class='hs-str'>"label"</span><span class='hs-layout'>,</span>
<a name="line-139"></a> <span class='hs-str'>"library"</span><span class='hs-layout'>,</span> <span class='hs-str'>"linkage"</span><span class='hs-layout'>,</span> <span class='hs-str'>"literal"</span><span class='hs-layout'>,</span> <span class='hs-str'>"loop"</span><span class='hs-layout'>,</span> <span class='hs-str'>"map"</span><span class='hs-layout'>,</span> <span class='hs-str'>"mod"</span><span class='hs-layout'>,</span> <span class='hs-str'>"nand"</span><span class='hs-layout'>,</span> <span class='hs-str'>"new"</span><span class='hs-layout'>,</span>
<a name="line-140"></a> <span class='hs-str'>"next"</span><span class='hs-layout'>,</span> <span class='hs-str'>"nor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"not"</span><span class='hs-layout'>,</span> <span class='hs-str'>"null"</span><span class='hs-layout'>,</span> <span class='hs-str'>"of"</span><span class='hs-layout'>,</span> <span class='hs-str'>"on"</span><span class='hs-layout'>,</span> <span class='hs-str'>"open"</span><span class='hs-layout'>,</span> <span class='hs-str'>"or"</span><span class='hs-layout'>,</span> <span class='hs-str'>"others"</span><span class='hs-layout'>,</span>
<a name="line-141"></a> <span class='hs-str'>"out"</span><span class='hs-layout'>,</span> <span class='hs-str'>"package"</span><span class='hs-layout'>,</span> <span class='hs-str'>"port"</span><span class='hs-layout'>,</span> <span class='hs-str'>"postponed"</span><span class='hs-layout'>,</span> <span class='hs-str'>"procedure"</span><span class='hs-layout'>,</span> <span class='hs-str'>"process"</span><span class='hs-layout'>,</span> <span class='hs-str'>"pure"</span><span class='hs-layout'>,</span>
<a name="line-142"></a> <span class='hs-str'>"range"</span><span class='hs-layout'>,</span> <span class='hs-str'>"record"</span><span class='hs-layout'>,</span> <span class='hs-str'>"register"</span><span class='hs-layout'>,</span> <span class='hs-str'>"reject"</span><span class='hs-layout'>,</span> <span class='hs-str'>"rem"</span><span class='hs-layout'>,</span> <span class='hs-str'>"report"</span><span class='hs-layout'>,</span> <span class='hs-str'>"return"</span><span class='hs-layout'>,</span>
<a name="line-143"></a> <span class='hs-str'>"rol"</span><span class='hs-layout'>,</span> <span class='hs-str'>"ror"</span><span class='hs-layout'>,</span> <span class='hs-str'>"select"</span><span class='hs-layout'>,</span> <span class='hs-str'>"severity"</span><span class='hs-layout'>,</span> <span class='hs-str'>"shared"</span><span class='hs-layout'>,</span> <span class='hs-str'>"signal"</span><span class='hs-layout'>,</span> <span class='hs-str'>"sla"</span><span class='hs-layout'>,</span> <span class='hs-str'>"sll"</span><span class='hs-layout'>,</span>
<a name="line-144"></a> <span class='hs-str'>"sra"</span><span class='hs-layout'>,</span> <span class='hs-str'>"srl"</span><span class='hs-layout'>,</span> <span class='hs-str'>"subtype"</span><span class='hs-layout'>,</span> <span class='hs-str'>"then"</span><span class='hs-layout'>,</span> <span class='hs-str'>"to"</span><span class='hs-layout'>,</span> <span class='hs-str'>"transport"</span><span class='hs-layout'>,</span> <span class='hs-str'>"type"</span><span class='hs-layout'>,</span>
<a name="line-145"></a> <span class='hs-str'>"unaffected"</span><span class='hs-layout'>,</span> <span class='hs-str'>"units"</span><span class='hs-layout'>,</span> <span class='hs-str'>"until"</span><span class='hs-layout'>,</span> <span class='hs-str'>"use"</span><span class='hs-layout'>,</span> <span class='hs-str'>"variable"</span><span class='hs-layout'>,</span> <span class='hs-str'>"wait"</span><span class='hs-layout'>,</span> <span class='hs-str'>"when"</span><span class='hs-layout'>,</span>
<a name="line-146"></a> <span class='hs-str'>"while"</span><span class='hs-layout'>,</span> <span class='hs-str'>"with"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xnor"</span><span class='hs-layout'>,</span> <span class='hs-str'>"xor"</span><span class='hs-keyglyph'>]</span>
<a name="line-147"></a>
<a name="line-148"></a>
<a name="line-149"></a>
<a name="line-150"></a>
<a name="line-151"></a>   <span class='hs-comment'>---------</span>
<a name="line-152"></a>   <span class='hs-comment'>-- AST --</span>
<a name="line-153"></a>   <span class='hs-comment'>---------</span>
<a name="line-154"></a>
<a name="line-155"></a>
<a name="line-156"></a><span class='hs-comment'>-- { } (0 or more) is expressed as [ ]</span>
<a name="line-157"></a><span class='hs-comment'>-- [ ] (optional) is expressed as Maybe</span>
<a name="line-158"></a>
<a name="line-159"></a>
<a name="line-160"></a><a name="DesignFile"></a><span class='hs-comment'>-- design_file</span>
<a name="line-161"></a><a name="DesignFile"></a><span class='hs-comment'>-- Having ContextClauses associated to library units is messy</span>
<a name="line-162"></a><a name="DesignFile"></a><span class='hs-comment'>-- instead we only allow ContextClause for the whole design file.</span>
<a name="line-163"></a><a name="DesignFile"></a><span class='hs-comment'>-- Furthermore we incorrectly (and deliberately) accept a file with </span>
<a name="line-164"></a><a name="DesignFile"></a><span class='hs-comment'>-- no library units </span>
<a name="line-165"></a><a name="DesignFile"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>DesignFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DesignFile</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ContextItem</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LibraryUnit</span><span class='hs-keyglyph'>]</span>  
<a name="line-166"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-167"></a>
<a name="line-168"></a><a name="ContextItem"></a><span class='hs-comment'>-- context_item</span>
<a name="line-169"></a><a name="ContextItem"></a><span class='hs-comment'>-- We don't allow the "name1,name2,name3" syntax, only one name is allowed</span>
<a name="line-170"></a><a name="ContextItem"></a><span class='hs-comment'>--  at once</span>
<a name="line-171"></a><a name="ContextItem"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ContextItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Library</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Use</span> <span class='hs-conid'>SelectedName</span>
<a name="line-172"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-173"></a>
<a name="line-174"></a><a name="LibraryUnit"></a><span class='hs-comment'>-- library_unit</span>
<a name="line-175"></a><a name="LibraryUnit"></a><span class='hs-comment'>-- We avoid adding the overhead of a PrimaryUnit and SecondaryUnit types</span>
<a name="line-176"></a><a name="LibraryUnit"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>LibraryUnit</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LUEntity</span> <span class='hs-conid'>EntityDec</span>      <span class='hs-keyglyph'>|</span> 
<a name="line-177"></a>                   <span class='hs-conid'>LUArch</span> <span class='hs-conid'>ArchBody</span>         <span class='hs-keyglyph'>|</span> 
<a name="line-178"></a>                   <span class='hs-conid'>LUPackageDec</span> <span class='hs-conid'>PackageDec</span> <span class='hs-keyglyph'>|</span>
<a name="line-179"></a>                   <span class='hs-conid'>LUPackageBody</span> <span class='hs-conid'>PackageBody</span>
<a name="line-180"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-181"></a>
<a name="line-182"></a><a name="EntityDec"></a><span class='hs-comment'>-- entity_declaration</span>
<a name="line-183"></a><a name="EntityDec"></a><span class='hs-comment'>-- No declarative nor statemet part is allowed </span>
<a name="line-184"></a><a name="EntityDec"></a><span class='hs-comment'>-- Only interface signal declarations are allowed in the port clause</span>
<a name="line-185"></a><a name="EntityDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>EntityDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EntityDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceSigDec</span><span class='hs-keyglyph'>]</span>
<a name="line-186"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="IfaceSigDec"></a><span class='hs-comment'>-- | interface_signal_declaration</span>
<a name="line-189"></a><a name="IfaceSigDec"></a><span class='hs-comment'>-- We don't allow the "id1,id2,id3" syntax, only one identifier is allowed</span>
<a name="line-190"></a><a name="IfaceSigDec"></a><span class='hs-comment'>--  at once</span>
<a name="line-191"></a><a name="IfaceSigDec"></a><span class='hs-comment'>-- The Mode is mandatory</span>
<a name="line-192"></a><a name="IfaceSigDec"></a><span class='hs-comment'>-- Bus is not allowed </span>
<a name="line-193"></a><a name="IfaceSigDec"></a><span class='hs-comment'>-- Preasigned values are not allowed</span>
<a name="line-194"></a><a name="IfaceSigDec"></a><span class='hs-comment'>-- Subtype indications are not allowed, just a typemark </span>
<a name="line-195"></a><a name="IfaceSigDec"></a><span class='hs-comment'>-- Constraints are not allowed: just add a new type with the constarint</span>
<a name="line-196"></a><a name="IfaceSigDec"></a><span class='hs-comment'>--  in ForSyDe.vhd if it is required</span>
<a name="line-197"></a><a name="IfaceSigDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IfaceSigDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IfaceSigDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>Mode</span> <span class='hs-conid'>TypeMark</span>
<a name="line-198"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-199"></a>
<a name="line-200"></a><a name="TypeMark"></a><span class='hs-comment'>-- | type_mark</span>
<a name="line-201"></a><a name="TypeMark"></a><span class='hs-comment'>-- We don't distinguish between type names and subtype names</span>
<a name="line-202"></a><a name="TypeMark"></a><span class='hs-comment'>-- We dont' support selected names, only simple names because we won't need</span>
<a name="line-203"></a><a name="TypeMark"></a><span class='hs-comment'>-- name selection (i.e. Use clauses will make name selection unnecesary)</span>
<a name="line-204"></a><a name="TypeMark"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>TypeMark</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SimpleName</span>
<a name="line-205"></a>
<a name="line-206"></a>
<a name="line-207"></a><a name="Mode"></a><span class='hs-comment'>-- | mode</span>
<a name="line-208"></a><a name="Mode"></a><span class='hs-comment'>-- INOUT | BUFFER | LINKAGE are not allowed</span>
<a name="line-209"></a><a name="Mode"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Mode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>In</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Out</span>
<a name="line-210"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-211"></a>
<a name="line-212"></a><a name="ArchBody"></a><span class='hs-comment'>-- | architecture_body </span>
<a name="line-213"></a><a name="ArchBody"></a><span class='hs-comment'>-- [ ARCHITECTURE ] and [ architecture_simple_name ] are not allowed</span>
<a name="line-214"></a><a name="ArchBody"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ArchBody</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ArchBody</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>VHDLName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>BlockDecItem</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConcSm</span><span class='hs-keyglyph'>]</span>
<a name="line-215"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-216"></a>
<a name="line-217"></a><a name="PackageDec"></a><span class='hs-comment'>-- | package_declaration</span>
<a name="line-218"></a><a name="PackageDec"></a><span class='hs-comment'>--  [ PACKAGE ] and [ package_simple_name ] are not allowed</span>
<a name="line-219"></a><a name="PackageDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PackageDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PackageDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PackageDecItem</span><span class='hs-keyglyph'>]</span>
<a name="line-220"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-221"></a>
<a name="line-222"></a>
<a name="line-223"></a><a name="PackageDecItem"></a><span class='hs-comment'>-- | package_declarative_item</span>
<a name="line-224"></a><a name="PackageDecItem"></a><span class='hs-comment'>-- only type declarations, subtype declarations and subprogram specifications </span>
<a name="line-225"></a><a name="PackageDecItem"></a><span class='hs-comment'>-- (working as subprogram_declaration) allowed</span>
<a name="line-226"></a><a name="PackageDecItem"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PackageDecItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PDITD</span> <span class='hs-conid'>TypeDec</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PDISD</span> <span class='hs-conid'>SubtypeDec</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PDISS</span> <span class='hs-conid'>SubProgSpec</span>
<a name="line-227"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-228"></a>
<a name="line-229"></a><a name="PackageBody"></a><span class='hs-comment'>-- | package_body</span>
<a name="line-230"></a><a name="PackageBody"></a><span class='hs-comment'>--  [ PACKAGE ] and [ package_simple_name ] are not allowed</span>
<a name="line-231"></a><a name="PackageBody"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PackageBody</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PackageBody</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PackageBodyDecItem</span><span class='hs-keyglyph'>]</span>
<a name="line-232"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-233"></a>
<a name="line-234"></a><a name="PackageBodyDecItem"></a><span class='hs-comment'>-- | only subprogram_body is allowed</span>
<a name="line-235"></a><a name="PackageBodyDecItem"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageBodyDecItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SubProgBody</span>
<a name="line-236"></a>
<a name="line-237"></a><a name="SubtypeDec"></a><span class='hs-comment'>-- | subtype-declaration</span>
<a name="line-238"></a><a name="SubtypeDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SubtypeDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SubtypeDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>SubtypeIn</span>
<a name="line-239"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-240"></a>
<a name="line-241"></a><a name="SubtypeIn"></a><span class='hs-comment'>-- | subtype_indication</span>
<a name="line-242"></a><a name="SubtypeIn"></a><span class='hs-comment'>--   resolution functions are not permitted</span>
<a name="line-243"></a><a name="SubtypeIn"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SubtypeIn</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SubtypeIn</span> <span class='hs-conid'>TypeMark</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Constraint</span><span class='hs-layout'>)</span>
<a name="line-244"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-245"></a>
<a name="line-246"></a><a name="Constraint"></a><span class='hs-comment'>-- | constraint</span>
<a name="line-247"></a><a name="Constraint"></a><span class='hs-comment'>-- Only index constraints are allowed</span>
<a name="line-248"></a><a name="Constraint"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Constraint</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IndexConstraint</span>
<a name="line-249"></a>
<a name="line-250"></a><a name="Range"></a><span class='hs-comment'>-- | range</span>
<a name="line-251"></a><a name="Range"></a><span class='hs-comment'>--   the direction must always be \"to\"</span>
<a name="line-252"></a><a name="Range"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Range</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AttribRange</span> <span class='hs-conid'>AttribName</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ToRange</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>
<a name="line-253"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-254"></a>
<a name="line-255"></a><a name="IndexConstraint"></a><span class='hs-comment'>-- | index_constraint</span>
<a name="line-256"></a><a name="IndexConstraint"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IndexConstraint</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IndexConstraint</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DiscreteRange</span><span class='hs-keyglyph'>]</span>
<a name="line-257"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-258"></a>
<a name="line-259"></a><a name="DiscreteRange"></a><span class='hs-comment'>-- | discrete_range</span>
<a name="line-260"></a><a name="DiscreteRange"></a><span class='hs-comment'>--   only ranges are allowed</span>
<a name="line-261"></a><a name="DiscreteRange"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>DiscreteRange</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Range</span>
<a name="line-262"></a>
<a name="line-263"></a><a name="TypeDec"></a><span class='hs-comment'>-- | type_declaration</span>
<a name="line-264"></a><a name="TypeDec"></a><span class='hs-comment'>-- only full_type_declarations are allowed</span>
<a name="line-265"></a><a name="TypeDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TypeDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TypeDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>TypeDef</span>
<a name="line-266"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-267"></a>
<a name="line-268"></a><a name="TypeDef"></a><span class='hs-comment'>-- | type_declaration</span>
<a name="line-269"></a><a name="TypeDef"></a><span class='hs-comment'>-- only composite types and enumeration types (a specific scalar type)</span>
<a name="line-270"></a><a name="TypeDef"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TypeDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TDA</span> <span class='hs-conid'>ArrayTypeDef</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TDR</span> <span class='hs-conid'>RecordTypeDef</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TDE</span> <span class='hs-conid'>EnumTypeDef</span>
<a name="line-271"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-272"></a>
<a name="line-273"></a><a name="ArrayTypeDef"></a><span class='hs-comment'>-- | array_type_definition</span>
<a name="line-274"></a><a name="ArrayTypeDef"></a><span class='hs-comment'>--     unconstrained_array_definition</span>
<a name="line-275"></a><a name="ArrayTypeDef"></a><span class='hs-comment'>--     constrained_array_definition</span>
<a name="line-276"></a><a name="ArrayTypeDef"></a><span class='hs-comment'>-- A TypeMark is used instead of a subtype_indication. If subtyping is required,</span>
<a name="line-277"></a><a name="ArrayTypeDef"></a><span class='hs-comment'>-- declare a subtype explicitly.  </span>
<a name="line-278"></a><a name="ArrayTypeDef"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ArrayTypeDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UnconsArrayDef</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TypeMark</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>TypeMark</span> <span class='hs-keyglyph'>|</span>
<a name="line-279"></a>                    <span class='hs-conid'>ConsArrayDef</span> <span class='hs-conid'>IndexConstraint</span> <span class='hs-conid'>TypeMark</span>
<a name="line-280"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-281"></a>
<a name="line-282"></a><a name="RecordTypeDef"></a><span class='hs-comment'>-- | record_type_definition</span>
<a name="line-283"></a><a name="RecordTypeDef"></a><span class='hs-comment'>-- [ record_type_simple_name ] not allowed</span>
<a name="line-284"></a><a name="RecordTypeDef"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>RecordTypeDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RecordTypeDef</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ElementDec</span><span class='hs-keyglyph'>]</span>
<a name="line-285"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-286"></a>
<a name="line-287"></a><a name="ElementDec"></a><span class='hs-comment'>-- | element_declaration </span>
<a name="line-288"></a><a name="ElementDec"></a><span class='hs-comment'>-- multi-identifier element declarations not allowed</span>
<a name="line-289"></a><a name="ElementDec"></a><span class='hs-comment'>-- element_subtype_definition is simplified to a type_mark</span>
<a name="line-290"></a><a name="ElementDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ElementDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ElementDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>TypeMark</span>
<a name="line-291"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-292"></a>
<a name="line-293"></a><a name="EnumTypeDef"></a><span class='hs-comment'>-- | enumeration_type_definition </span>
<a name="line-294"></a><a name="EnumTypeDef"></a><span class='hs-comment'>--   enumeration literals can only be identifiers</span>
<a name="line-295"></a><a name="EnumTypeDef"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>EnumTypeDef</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EnumTypeDef</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>VHDLId</span><span class='hs-keyglyph'>]</span>
<a name="line-296"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-297"></a>
<a name="line-298"></a><a name="VHDLName"></a><span class='hs-comment'>-- | name</span>
<a name="line-299"></a><a name="VHDLName"></a><span class='hs-comment'>-- operator_names are not allowed </span>
<a name="line-300"></a><a name="VHDLName"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>VHDLName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NSimple</span> <span class='hs-conid'>SimpleName</span>     <span class='hs-keyglyph'>|</span> 
<a name="line-301"></a>                <span class='hs-conid'>NSelected</span> <span class='hs-conid'>SelectedName</span> <span class='hs-keyglyph'>|</span> 
<a name="line-302"></a>                <span class='hs-conid'>NIndexed</span> <span class='hs-conid'>IndexedName</span>   <span class='hs-keyglyph'>|</span>
<a name="line-303"></a>                <span class='hs-conid'>NSlice</span> <span class='hs-conid'>SliceName</span>       <span class='hs-keyglyph'>|</span>
<a name="line-304"></a>                <span class='hs-conid'>NAttribute</span> <span class='hs-conid'>AttribName</span> 
<a name="line-305"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-306"></a>
<a name="line-307"></a><a name="SimpleName"></a><span class='hs-comment'>-- | simple_name</span>
<a name="line-308"></a><a name="SimpleName"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SimpleName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VHDLId</span>
<a name="line-309"></a>
<a name="line-310"></a><a name="SelectedName"></a><span class='hs-comment'>-- | selected_name</span>
<a name="line-311"></a><a name="SelectedName"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SelectedName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Prefix</span> <span class='hs-conop'>:.:</span> <span class='hs-conid'>Suffix</span>
<a name="line-312"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-313"></a>
<a name="line-314"></a><span class='hs-keyword'>infixl</span> <span class='hs-conop'>:.:</span>
<a name="line-315"></a>
<a name="line-316"></a><a name="IndexedName"></a><span class='hs-comment'>-- | indexed_name</span>
<a name="line-317"></a><a name="IndexedName"></a><span class='hs-comment'>-- note that according to the VHDL93 grammar the index list cannot be empty </span>
<a name="line-318"></a><a name="IndexedName"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IndexedName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IndexedName</span> <span class='hs-conid'>Prefix</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Expr</span><span class='hs-keyglyph'>]</span>
<a name="line-319"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-320"></a>
<a name="line-321"></a><a name="Prefix"></a><span class='hs-comment'>-- | prefix</span>
<a name="line-322"></a><a name="Prefix"></a><span class='hs-comment'>--  only names (no function calls)</span>
<a name="line-323"></a><a name="Prefix"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Prefix</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VHDLName</span>
<a name="line-324"></a>
<a name="line-325"></a><a name="Suffix"></a><span class='hs-comment'>-- | suffix</span>
<a name="line-326"></a><a name="Suffix"></a><span class='hs-comment'>-- no character or operator symbols are accepted</span>
<a name="line-327"></a><a name="Suffix"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Suffix</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SSimple</span> <span class='hs-conid'>SimpleName</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>All</span>
<a name="line-328"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-329"></a>
<a name="line-330"></a>
<a name="line-331"></a><a name="SliceName"></a><span class='hs-comment'>-- | slice_name</span>
<a name="line-332"></a><a name="SliceName"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SliceName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SliceName</span> <span class='hs-conid'>Prefix</span> <span class='hs-conid'>DiscreteRange</span>
<a name="line-333"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-334"></a>
<a name="line-335"></a><a name="AttribName"></a><span class='hs-comment'>-- | attribute_name</span>
<a name="line-336"></a><a name="AttribName"></a><span class='hs-comment'>--   signatures are not allowed</span>
<a name="line-337"></a><a name="AttribName"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>AttribName</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AttribName</span> <span class='hs-conid'>Prefix</span> <span class='hs-conid'>SimpleName</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Expr</span><span class='hs-layout'>)</span>
<a name="line-338"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-339"></a>
<a name="line-340"></a><a name="BlockDecItem"></a><span class='hs-comment'>-- | block_declarative_item</span>
<a name="line-341"></a><a name="BlockDecItem"></a><span class='hs-comment'>-- Only subprogram bodies and signal declarations are allowed</span>
<a name="line-342"></a><a name="BlockDecItem"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>BlockDecItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BDISPB</span> <span class='hs-conid'>SubProgBody</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BDISD</span> <span class='hs-conid'>SigDec</span>
<a name="line-343"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-344"></a>
<a name="line-345"></a>
<a name="line-346"></a><a name="SubProgBody"></a><span class='hs-comment'>-- | subprogram_body</span>
<a name="line-347"></a><a name="SubProgBody"></a><span class='hs-comment'>-- No subprogram kind nor designator is allowed</span>
<a name="line-348"></a><a name="SubProgBody"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SubProgBody</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SubProgBody</span> <span class='hs-conid'>SubProgSpec</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SubProgDecItem</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SeqSm</span><span class='hs-keyglyph'>]</span>
<a name="line-349"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-350"></a>
<a name="line-351"></a><a name="SubProgDecItem"></a><span class='hs-comment'>-- | subprogram_declarative_item</span>
<a name="line-352"></a><a name="SubProgDecItem"></a><span class='hs-comment'>--   only varaible declarations are allowed.</span>
<a name="line-353"></a><a name="SubProgDecItem"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SubProgDecItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SPVD</span> <span class='hs-conid'>VarDec</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SPSB</span> <span class='hs-conid'>SubProgBody</span>
<a name="line-354"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-355"></a>
<a name="line-356"></a><a name="VarDec"></a><span class='hs-comment'>-- | variable_declaration</span>
<a name="line-357"></a><a name="VarDec"></a><span class='hs-comment'>--   identifier lists are not allowed</span>
<a name="line-358"></a><a name="VarDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>VarDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VarDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>SubtypeIn</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Expr</span><span class='hs-layout'>)</span>
<a name="line-359"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-360"></a>
<a name="line-361"></a><a name="SubProgSpec"></a><span class='hs-comment'>-- | subprogram_specification</span>
<a name="line-362"></a><a name="SubProgSpec"></a><span class='hs-comment'>-- Only Functions are allowed</span>
<a name="line-363"></a><a name="SubProgSpec"></a><span class='hs-comment'>-- [Pure | Impure] is not allowed</span>
<a name="line-364"></a><a name="SubProgSpec"></a><span class='hs-comment'>-- Only an identifier is valid as the designator</span>
<a name="line-365"></a><a name="SubProgSpec"></a><span class='hs-comment'>-- In the formal parameter list only variable declarations are accepted  </span>
<a name="line-366"></a><a name="SubProgSpec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SubProgSpec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Function</span> <span class='hs-conid'>VHDLId</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceVarDec</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>TypeMark</span> 
<a name="line-367"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-368"></a>
<a name="line-369"></a><a name="IfaceVarDec"></a><span class='hs-comment'>-- | interface_variable_declaration</span>
<a name="line-370"></a><a name="IfaceVarDec"></a><span class='hs-comment'>-- [variable] is not allowed</span>
<a name="line-371"></a><a name="IfaceVarDec"></a><span class='hs-comment'>-- We don't allow the "id1,id2,id3" syntax, only one identifier is allowed</span>
<a name="line-372"></a><a name="IfaceVarDec"></a><span class='hs-comment'>-- Mode is not allowed</span>
<a name="line-373"></a><a name="IfaceVarDec"></a><span class='hs-comment'>-- Resolution functions and constraints are not allowed, thus a TypeMark</span>
<a name="line-374"></a><a name="IfaceVarDec"></a><span class='hs-comment'>--  is used instead of a subtype_indication. If subtyping is required,</span>
<a name="line-375"></a><a name="IfaceVarDec"></a><span class='hs-comment'>--  declare a subtype explicitly.</span>
<a name="line-376"></a><a name="IfaceVarDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IfaceVarDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IfaceVarDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>TypeMark</span>
<a name="line-377"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-378"></a>
<a name="line-379"></a><a name="SeqSm"></a><span class='hs-comment'>-- | sequential_statement</span>
<a name="line-380"></a><a name="SeqSm"></a><span class='hs-comment'>-- Only If, case, return, for loops, assignment, @wait for@ procedure calls</span>
<a name="line-381"></a><a name="SeqSm"></a><span class='hs-comment'>-- allowed.</span>
<a name="line-382"></a><a name="SeqSm"></a><span class='hs-comment'>-- Only for loops are allowed (thus loop_statement doesn't exist) and cannot</span>
<a name="line-383"></a><a name="SeqSm"></a><span class='hs-comment'>-- be provided labels.</span>
<a name="line-384"></a><a name="SeqSm"></a><span class='hs-comment'>-- The target cannot be an aggregate.</span>
<a name="line-385"></a><a name="SeqSm"></a><span class='hs-comment'>-- General wait statements are not allowed, only @wait for@</span>
<a name="line-386"></a><a name="SeqSm"></a><span class='hs-comment'>-- It is incorrect to have an empty [CaseSmAlt]</span>
<a name="line-387"></a><a name="SeqSm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SeqSm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IfSm</span>  <span class='hs-conid'>Expr</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SeqSm</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ElseIf</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Else</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span>
<a name="line-388"></a>             <span class='hs-conid'>CaseSm</span> <span class='hs-conid'>Expr</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CaseSmAlt</span><span class='hs-keyglyph'>]</span>                  <span class='hs-keyglyph'>|</span>
<a name="line-389"></a>             <span class='hs-conid'>ReturnSm</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Expr</span><span class='hs-layout'>)</span>                    <span class='hs-keyglyph'>|</span>
<a name="line-390"></a>             <span class='hs-conid'>ForSM</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>DiscreteRange</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SeqSm</span><span class='hs-keyglyph'>]</span>       <span class='hs-keyglyph'>|</span>
<a name="line-391"></a>             <span class='hs-conid'>VHDLName</span> <span class='hs-conop'>:=</span> <span class='hs-conid'>Expr</span>                         <span class='hs-keyglyph'>|</span>
<a name="line-392"></a>             <span class='hs-conid'>WaitFor</span> <span class='hs-conid'>Expr</span>                             <span class='hs-keyglyph'>|</span>
<a name="line-393"></a>             <span class='hs-conid'>SigAssign</span>  <span class='hs-conid'>VHDLName</span> <span class='hs-conid'>Wform</span>                <span class='hs-keyglyph'>|</span>
<a name="line-394"></a>             <span class='hs-conid'>ProcCall</span> <span class='hs-conid'>VHDLName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AssocElem</span><span class='hs-keyglyph'>]</span>
<a name="line-395"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-396"></a>
<a name="line-397"></a><a name="ElseIf"></a><span class='hs-comment'>-- | helper type, they doesn't exist in the origianl grammar</span>
<a name="line-398"></a><a name="ElseIf"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ElseIf</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ElseIf</span> <span class='hs-conid'>Expr</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SeqSm</span><span class='hs-keyglyph'>]</span>
<a name="line-399"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-400"></a>
<a name="line-401"></a><a name="Else"></a><span class='hs-comment'>-- | helper type, it doesn't exist in the origianl grammar</span>
<a name="line-402"></a><a name="Else"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Else</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Else</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SeqSm</span><span class='hs-keyglyph'>]</span>
<a name="line-403"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-404"></a>
<a name="line-405"></a><a name="CaseSmAlt"></a><span class='hs-comment'>-- | case_statement_alternative</span>
<a name="line-406"></a><a name="CaseSmAlt"></a><span class='hs-comment'>-- it is incorrect to have an empty [Choice]</span>
<a name="line-407"></a><a name="CaseSmAlt"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CaseSmAlt</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CaseSmAlt</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Choice</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SeqSm</span><span class='hs-keyglyph'>]</span>
<a name="line-408"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-409"></a>
<a name="line-410"></a><a name="Choice"></a><span class='hs-comment'>-- | choice</span>
<a name="line-411"></a><a name="Choice"></a><span class='hs-comment'>-- although any expression is allowed the grammar specfically only allows </span>
<a name="line-412"></a><a name="Choice"></a><span class='hs-comment'>-- simple_expressions (not covered in this AST) </span>
<a name="line-413"></a><a name="Choice"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Choice</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ChoiceE</span> <span class='hs-conid'>Expr</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Others</span>
<a name="line-414"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-415"></a>
<a name="line-416"></a><a name="SigDec"></a><span class='hs-comment'>-- | signal_declaration</span>
<a name="line-417"></a><a name="SigDec"></a><span class='hs-comment'>-- We don't allow the "id1,id2,id3" syntax, only one identifier is allowed</span>
<a name="line-418"></a><a name="SigDec"></a><span class='hs-comment'>--  at once</span>
<a name="line-419"></a><a name="SigDec"></a><span class='hs-comment'>-- Resolution functions and constraints are not allowed, thus a TypeMark</span>
<a name="line-420"></a><a name="SigDec"></a><span class='hs-comment'>--  is used instead of a subtype_indication</span>
<a name="line-421"></a><a name="SigDec"></a><span class='hs-comment'>-- Signal kinds are not allowed</span>
<a name="line-422"></a><a name="SigDec"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SigDec</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SigDec</span> <span class='hs-conid'>VHDLId</span> <span class='hs-conid'>TypeMark</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Expr</span><span class='hs-layout'>)</span>
<a name="line-423"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-424"></a>
<a name="line-425"></a><a name="ConcSm"></a><span class='hs-comment'>-- | concurrent_statement</span>
<a name="line-426"></a><a name="ConcSm"></a><span class='hs-comment'>-- only block statements, component instantiations and signal assignments </span>
<a name="line-427"></a><a name="ConcSm"></a><span class='hs-comment'>-- are allowed</span>
<a name="line-428"></a><a name="ConcSm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ConcSm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CSBSm</span> <span class='hs-conid'>BlockSm</span> <span class='hs-keyglyph'>|</span> 
<a name="line-429"></a>              <span class='hs-conid'>CSSASm</span>  <span class='hs-conid'>ConSigAssignSm</span> <span class='hs-keyglyph'>|</span> 
<a name="line-430"></a>              <span class='hs-conid'>CSISm</span> <span class='hs-conid'>CompInsSm</span>  <span class='hs-keyglyph'>|</span>
<a name="line-431"></a>              <span class='hs-conid'>CSPSm</span> <span class='hs-conid'>ProcSm</span>
<a name="line-432"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-433"></a>
<a name="line-434"></a><a name="BlockSm"></a><span class='hs-comment'>-- | block_statement</span>
<a name="line-435"></a><a name="BlockSm"></a><span class='hs-comment'>-- Generics are not supported</span>
<a name="line-436"></a><a name="BlockSm"></a><span class='hs-comment'>-- The port_clause (with only signals) and port_map_aspect are mandatory</span>
<a name="line-437"></a><a name="BlockSm"></a><span class='hs-comment'>-- The ending [ block_label ] is not allowed</span>
<a name="line-438"></a><a name="BlockSm"></a><span class='hs-comment'>-- </span>
<a name="line-439"></a><a name="BlockSm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>BlockSm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BlockSm</span> <span class='hs-conid'>Label</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceSigDec</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>PMapAspect</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>BlockDecItem</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConcSm</span><span class='hs-keyglyph'>]</span>
<a name="line-440"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-441"></a>
<a name="line-442"></a><a name="PMapAspect"></a><span class='hs-comment'>-- | port_map_aspect</span>
<a name="line-443"></a><a name="PMapAspect"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>PMapAspect</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PMapAspect</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AssocElem</span><span class='hs-keyglyph'>]</span>
<a name="line-444"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-445"></a>
<a name="line-446"></a><a name="Label"></a><span class='hs-comment'>-- | label</span>
<a name="line-447"></a><a name="Label"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Label</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VHDLId</span>
<a name="line-448"></a>
<a name="line-449"></a><a name="AssocElem"></a><span class='hs-comment'>-- | association_element</span>
<a name="line-450"></a><a name="AssocElem"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>AssocElem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>FormalPart</span><span class='hs-layout'>)</span> <span class='hs-conop'>:=&gt;:</span> <span class='hs-conid'>ActualPart</span>
<a name="line-451"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-452"></a>
<a name="line-453"></a><a name="FormalPart"></a><span class='hs-comment'>-- | formal_part</span>
<a name="line-454"></a><a name="FormalPart"></a><span class='hs-comment'>-- We only accept a formal_designator (which is a name after all),</span>
<a name="line-455"></a><a name="FormalPart"></a><span class='hs-comment'>-- in the forme of simple name (no need for selected names)   </span>
<a name="line-456"></a><a name="FormalPart"></a><span class='hs-comment'>--  "function_name ( formal_designator )" and "type_mark ( formal_designator )"</span>
<a name="line-457"></a><a name="FormalPart"></a><span class='hs-comment'>--  are not allowed</span>
<a name="line-458"></a><a name="FormalPart"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>FormalPart</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SimpleName</span>
<a name="line-459"></a>
<a name="line-460"></a><a name="ActualPart"></a><span class='hs-comment'>-- | actual_part</span>
<a name="line-461"></a><a name="ActualPart"></a><span class='hs-comment'>-- We only accept an actual_designator,</span>
<a name="line-462"></a><a name="ActualPart"></a><span class='hs-comment'>--  "function_name ( actual_designator )" and "type_mark ( actual_designator )"</span>
<a name="line-463"></a><a name="ActualPart"></a><span class='hs-comment'>--  are not allowed</span>
<a name="line-464"></a><a name="ActualPart"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ActualPart</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ActualDesig</span>
<a name="line-465"></a>
<a name="line-466"></a><a name="ActualDesig"></a><span class='hs-comment'>-- | actual_designator</span>
<a name="line-467"></a><a name="ActualDesig"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ActualDesig</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ADName</span> <span class='hs-conid'>VHDLName</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ADExpr</span> <span class='hs-conid'>Expr</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Open</span>
<a name="line-468"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-469"></a>
<a name="line-470"></a><a name="ConSigAssignSm"></a><span class='hs-comment'>-- | concurrent_signal_assignment_statement</span>
<a name="line-471"></a><a name="ConSigAssignSm"></a><span class='hs-comment'>-- Only conditional_signal_assignment is allowed (without options)</span>
<a name="line-472"></a><a name="ConSigAssignSm"></a><span class='hs-comment'>-- The LHS (targets) are simply signal names, no aggregates</span>
<a name="line-473"></a><a name="ConSigAssignSm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ConSigAssignSm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VHDLName</span> <span class='hs-conop'>:&lt;==:</span> <span class='hs-conid'>ConWforms</span>
<a name="line-474"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-475"></a>
<a name="line-476"></a><a name="ConWforms"></a><span class='hs-comment'>-- | conditional_waveforms </span>
<a name="line-477"></a><a name="ConWforms"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ConWforms</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ConWforms</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>WhenElse</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>Wform</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>When</span><span class='hs-layout'>)</span>  
<a name="line-478"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-479"></a>
<a name="line-480"></a><a name="WhenElse"></a><span class='hs-comment'>-- | Helper type, it doesn't exist in the VHDL grammar</span>
<a name="line-481"></a><a name="WhenElse"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>WhenElse</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WhenElse</span> <span class='hs-conid'>Wform</span> <span class='hs-conid'>Expr</span>
<a name="line-482"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-483"></a>
<a name="line-484"></a><a name="When"></a><span class='hs-comment'>-- | Helper type, it doesn't exist in the VHDL grammar</span>
<a name="line-485"></a><a name="When"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>When</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>When</span> <span class='hs-conid'>Expr</span>
<a name="line-486"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-487"></a>
<a name="line-488"></a><a name="Wform"></a><span class='hs-comment'>-- | waveform</span>
<a name="line-489"></a><a name="Wform"></a><span class='hs-comment'>-- although it is possible to leave [Expr] empty, that's obviously not</span>
<a name="line-490"></a><a name="Wform"></a><span class='hs-comment'>-- valid VHDL waveform</span>
<a name="line-491"></a><a name="Wform"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Wform</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Wform</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>WformElem</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Unaffected</span>
<a name="line-492"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-493"></a>
<a name="line-494"></a><a name="WformElem"></a><span class='hs-comment'>-- | waveform_element</span>
<a name="line-495"></a><a name="WformElem"></a><span class='hs-comment'>--   Null is not accepted</span>
<a name="line-496"></a><a name="WformElem"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>WformElem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WformElem</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Expr</span><span class='hs-layout'>)</span>
<a name="line-497"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-498"></a>
<a name="line-499"></a>           
<a name="line-500"></a><a name="CompInsSm"></a><span class='hs-comment'>-- | component_instantiation_statement</span>
<a name="line-501"></a><a name="CompInsSm"></a><span class='hs-comment'>-- No generics supported</span>
<a name="line-502"></a><a name="CompInsSm"></a><span class='hs-comment'>-- The port map aspect is mandatory</span>
<a name="line-503"></a><a name="CompInsSm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CompInsSm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompInsSm</span> <span class='hs-conid'>Label</span> <span class='hs-conid'>InsUnit</span> <span class='hs-conid'>PMapAspect</span>
<a name="line-504"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-505"></a>
<a name="line-506"></a><a name="ProcSm"></a><span class='hs-comment'>-- | process_statement</span>
<a name="line-507"></a><a name="ProcSm"></a><span class='hs-comment'>--   The label is mandatory</span>
<a name="line-508"></a><a name="ProcSm"></a><span class='hs-comment'>--   Only simple names are accepted in the sensitivity list</span>
<a name="line-509"></a><a name="ProcSm"></a><span class='hs-comment'>--   No declarative part is allowed</span>
<a name="line-510"></a><a name="ProcSm"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ProcSm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ProcSm</span> <span class='hs-conid'>Label</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SimpleName</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SeqSm</span><span class='hs-keyglyph'>]</span>
<a name="line-511"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-512"></a>
<a name="line-513"></a><a name="InsUnit"></a><span class='hs-comment'>-- | instantiated_unit</span>
<a name="line-514"></a><a name="InsUnit"></a><span class='hs-comment'>-- Only Entities are allowed and their architecture cannot be specified</span>
<a name="line-515"></a><a name="InsUnit"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>InsUnit</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IUEntity</span> <span class='hs-conid'>VHDLName</span>
<a name="line-516"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-517"></a>
<a name="line-518"></a><span class='hs-comment'>-----------------</span>
<a name="line-519"></a><span class='hs-comment'>-- Expression AST</span>
<a name="line-520"></a><span class='hs-comment'>-----------------</span>
<a name="line-521"></a>
<a name="line-522"></a><span class='hs-comment'>-- | expression, instead of creating an AST like the grammar </span>
<a name="line-523"></a><span class='hs-comment'>-- (see commented section below) we made our own expressions which are </span>
<a name="line-524"></a><span class='hs-comment'>-- easier to handle, but which don't don't show operand precedence</span>
<a name="line-525"></a><span class='hs-comment'>-- (that is a responsibility of the pretty printer)</span>
<a name="line-526"></a>
<a name="line-527"></a><a name="Expr"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Expr</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-- Logical operations</span>
<a name="line-528"></a>            <span class='hs-conid'>And</span>  <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-529"></a>            <span class='hs-conid'>Or</span>   <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-530"></a>            <span class='hs-conid'>Xor</span>  <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-531"></a>            <span class='hs-conid'>Nand</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-532"></a>            <span class='hs-conid'>Nor</span>  <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-533"></a>            <span class='hs-conid'>Xnor</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-534"></a>            <span class='hs-comment'>-- Relational Operators</span>
<a name="line-535"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:=:</span>  <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-536"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:/=:</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-537"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:&lt;:</span>  <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-538"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:&lt;=:</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-539"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:&gt;:</span>  <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-540"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:&gt;=:</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-541"></a>            <span class='hs-comment'>-- Shift Operators</span>
<a name="line-542"></a>            <span class='hs-conid'>Sll</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-543"></a>            <span class='hs-conid'>Srl</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-544"></a>            <span class='hs-conid'>Sla</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-545"></a>            <span class='hs-conid'>Sra</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-546"></a>            <span class='hs-conid'>Rol</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-547"></a>            <span class='hs-conid'>Ror</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-548"></a>            <span class='hs-comment'>-- Adding Operators</span>
<a name="line-549"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:+:</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-550"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:-:</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-551"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:&amp;:</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-552"></a>            <span class='hs-comment'>-- Sign Operators</span>
<a name="line-553"></a>            <span class='hs-conid'>Neg</span> <span class='hs-conid'>Expr</span>          <span class='hs-keyglyph'>|</span>
<a name="line-554"></a>            <span class='hs-conid'>Pos</span> <span class='hs-conid'>Expr</span>          <span class='hs-keyglyph'>|</span>
<a name="line-555"></a>            <span class='hs-comment'>-- Multiplying Operators</span>
<a name="line-556"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:*:</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-557"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:/:</span> <span class='hs-conid'>Expr</span>     <span class='hs-keyglyph'>|</span>
<a name="line-558"></a>            <span class='hs-conid'>Mod</span>  <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-559"></a>            <span class='hs-conid'>Rem</span>  <span class='hs-conid'>Expr</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-560"></a>            <span class='hs-comment'>-- Miscellaneous Operators</span>
<a name="line-561"></a>            <span class='hs-conid'>Expr</span> <span class='hs-conop'>:**:</span> <span class='hs-conid'>Expr</span>    <span class='hs-keyglyph'>|</span>
<a name="line-562"></a>            <span class='hs-conid'>Abs</span>  <span class='hs-conid'>Expr</span>         <span class='hs-keyglyph'>|</span>
<a name="line-563"></a>            <span class='hs-conid'>Not</span>  <span class='hs-conid'>Expr</span>         <span class='hs-keyglyph'>|</span>
<a name="line-564"></a>            <span class='hs-comment'>-- Primary expressions</span>
<a name="line-565"></a>            <span class='hs-comment'>-- Only literals, names and function calls  are allowed</span>
<a name="line-566"></a>            <span class='hs-conid'>PrimName</span> <span class='hs-conid'>VHDLName</span> <span class='hs-keyglyph'>|</span>
<a name="line-567"></a>            <span class='hs-conid'>PrimLit</span>   <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>|</span>
<a name="line-568"></a>            <span class='hs-conid'>PrimFCall</span> <span class='hs-conid'>FCall</span>   <span class='hs-keyglyph'>|</span>       
<a name="line-569"></a>            <span class='hs-comment'>-- Composite_types-related operators</span>
<a name="line-570"></a>            <span class='hs-conid'>Aggregate</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ElemAssoc</span><span class='hs-keyglyph'>]</span>   <span class='hs-comment'>-- (exp1,exp2,exp3, ...)</span>
<a name="line-571"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>            
<a name="line-572"></a>
<a name="line-573"></a><span class='hs-comment'>-- operand precedences, according to the VHDL LRM: </span>
<a name="line-574"></a><span class='hs-comment'>--  "Where the language</span>
<a name="line-575"></a><span class='hs-comment'>--   allows a sequence of operators, operators with the same</span>
<a name="line-576"></a><span class='hs-comment'>--   precedence level are associated with their operands in textual</span>
<a name="line-577"></a><span class='hs-comment'>--   order, from left to right." In other words, they are all left associative</span>
<a name="line-578"></a><span class='hs-comment'>--</span>
<a name="line-579"></a><span class='hs-comment'>--   For example: a / b / c    = (a/b)/c</span>
<a name="line-580"></a><span class='hs-comment'>--                a and b or c  is illegal (mixing operators is not allowed</span>
<a name="line-581"></a><span class='hs-comment'>--                                          by the language and only</span>
<a name="line-582"></a><span class='hs-comment'>--                                          can avoid parenthesis in some </span>
<a name="line-583"></a><span class='hs-comment'>--                                          cases)</span>
<a name="line-584"></a>
<a name="line-585"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>2</span> <span class='hs-varop'>`And`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Or`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Xor`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Nand`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Nor`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Xnor`</span>
<a name="line-586"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>3</span> <span class='hs-conop'>:=:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:/=:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:&lt;:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:&lt;=:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:&gt;:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:&gt;=:</span>
<a name="line-587"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>4</span> <span class='hs-varop'>`Sll`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Srl`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Sla`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Sra`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Rol`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Ror`</span>
<a name="line-588"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>5</span> <span class='hs-conop'>:+:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:-:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:&amp;:</span>
<a name="line-589"></a><span class='hs-keyword'>infix</span>  <span class='hs-num'>6</span> <span class='hs-varop'>`Neg`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Pos`</span>  
<a name="line-590"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>7</span> <span class='hs-conop'>:*:</span><span class='hs-layout'>,</span> <span class='hs-conop'>:/:</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Mod`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Rem`</span>
<a name="line-591"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>8</span> <span class='hs-conop'>:**:</span><span class='hs-layout'>,</span> <span class='hs-varop'>`Abs`</span><span class='hs-layout'>,</span>  <span class='hs-varop'>`Not`</span> 
<a name="line-592"></a>
<a name="line-593"></a><a name="logicalPrec"></a><span class='hs-comment'>-- | Logical Operators precedence</span>
<a name="line-594"></a><span class='hs-definition'>logicalPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-595"></a><span class='hs-definition'>logicalPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span>
<a name="line-596"></a>
<a name="line-597"></a><a name="relationalPrec"></a><span class='hs-comment'>-- | Relational Operators Precedence</span>
<a name="line-598"></a><span class='hs-definition'>relationalPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-599"></a><span class='hs-definition'>relationalPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>3</span>
<a name="line-600"></a>
<a name="line-601"></a><a name="shiftPrec"></a><span class='hs-comment'>-- | Shift Operators Precedence</span>
<a name="line-602"></a><span class='hs-definition'>shiftPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-603"></a><span class='hs-definition'>shiftPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>4</span>
<a name="line-604"></a>
<a name="line-605"></a><a name="plusPrec"></a><span class='hs-comment'>-- | Plus Operators precedence</span>
<a name="line-606"></a><span class='hs-definition'>plusPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-607"></a><span class='hs-definition'>plusPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>5</span>
<a name="line-608"></a>
<a name="line-609"></a><a name="signPrec"></a><span class='hs-comment'>-- | Sign Operators Precedence</span>
<a name="line-610"></a><span class='hs-definition'>signPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-611"></a><span class='hs-definition'>signPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>6</span>
<a name="line-612"></a>
<a name="line-613"></a><a name="multPrec"></a><span class='hs-comment'>-- | Multplying Operators Precedecne</span>
<a name="line-614"></a><span class='hs-definition'>multPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-615"></a><span class='hs-definition'>multPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>7</span>
<a name="line-616"></a>
<a name="line-617"></a><a name="miscPrec"></a><span class='hs-comment'>-- | Miscellaneous Operators Precedence</span>
<a name="line-618"></a><span class='hs-definition'>miscPrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-619"></a><span class='hs-definition'>miscPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>8</span>
<a name="line-620"></a>
<a name="line-621"></a>
<a name="line-622"></a>
<a name="line-623"></a>
<a name="line-624"></a><a name="ElemAssoc"></a><span class='hs-comment'>-- | element_association</span>
<a name="line-625"></a><a name="ElemAssoc"></a><span class='hs-comment'>--   only one choice is allowed</span>
<a name="line-626"></a><a name="ElemAssoc"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ElemAssoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ElemAssoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Choice</span><span class='hs-layout'>)</span> <span class='hs-conid'>Expr</span>
<a name="line-627"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-628"></a>
<a name="line-629"></a><a name="Literal"></a><span class='hs-comment'>-- | literal</span>
<a name="line-630"></a><a name="Literal"></a><span class='hs-comment'>-- Literals are expressed as a string (remember we are generating</span>
<a name="line-631"></a><a name="Literal"></a><span class='hs-comment'>-- code, not parsing)</span>
<a name="line-632"></a><a name="Literal"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span>
<a name="line-633"></a>
<a name="line-634"></a><a name="FCall"></a><span class='hs-comment'>-- | function_call</span>
<a name="line-635"></a><a name="FCall"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FCall</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FCall</span> <span class='hs-conid'>VHDLName</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AssocElem</span><span class='hs-keyglyph'>]</span>
<a name="line-636"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Show</span>
<a name="line-637"></a>             
<a name="line-638"></a>            
<a name="line-639"></a><span class='hs-comment'>{-
<a name="line-640"></a>
<a name="line-641"></a>Expression AST following the grammar (discarded)
<a name="line-642"></a>
<a name="line-643"></a>-- again, even if it possible to leave the [Relation] lists empty
<a name="line-644"></a>-- that wouldn't be valid VHDL code
<a name="line-645"></a>-- regading  NandExpr and NorExpr, their Relation list should 
<a name="line-646"></a>-- have a maximum size of two (i.e. NandExpr Expr (Maybe Expr))
<a name="line-647"></a>data Expr = AndExpr  [Relation] | 
<a name="line-648"></a>            OrExpr   [Relation] |
<a name="line-649"></a>            XorExpr  [Relation] |
<a name="line-650"></a>            NandExpr [Relation] |
<a name="line-651"></a>            NorExpr  [Relation] |
<a name="line-652"></a>            XnorExpr [Relation]
<a name="line-653"></a> deriving Show
<a name="line-654"></a>
<a name="line-655"></a>-- relation            
<a name="line-656"></a>data Relation = Relation ShiftExpr  (Maybe (RelOp,ShiftExpr))
<a name="line-657"></a> deriving Show
<a name="line-658"></a>
<a name="line-659"></a>-- relational_operator
<a name="line-660"></a>data RelOp = Eq | NEq | Less | LessEq | Gter | GterEq 
<a name="line-661"></a> deriving Show 
<a name="line-662"></a>
<a name="line-663"></a>-- shift_expression
<a name="line-664"></a>data ShiftExpr = ShiftExpr SimpleExpr (Maybe(ShiftOp,SimpleExpr)) 
<a name="line-665"></a> deriving Show
<a name="line-666"></a>
<a name="line-667"></a>-- simple_expression
<a name="line-668"></a>data SimpleExpr = SimpleExpr (Maybe Sign) Term [(AddOp,Term)]
<a name="line-669"></a> deriving Show
<a name="line-670"></a>
<a name="line-671"></a>-- sign
<a name="line-672"></a>data Sign = Pos | Neg
<a name="line-673"></a> deriving Show
<a name="line-674"></a>
<a name="line-675"></a>-- shift_operator
<a name="line-676"></a>data ShiftOp = Sll | Srl | Sla | Sra | Rol | Ror
<a name="line-677"></a> deriving Show 
<a name="line-678"></a>
<a name="line-679"></a>-- adding_operator
<a name="line-680"></a>data AddOp = Plus | Minus | Concat 
<a name="line-681"></a> deriving Show
<a name="line-682"></a>
<a name="line-683"></a>-- term
<a name="line-684"></a>data Term = Term Factor (Maybe (MultOp, Factor))
<a name="line-685"></a> deriving Show
<a name="line-686"></a>
<a name="line-687"></a>-- multiplying_operator
<a name="line-688"></a>data MultOp = Mult | Div | Mod | Rem
<a name="line-689"></a> deriving Show
<a name="line-690"></a>
<a name="line-691"></a>-- factor
<a name="line-692"></a>data Factor = Exp Primary (Maybe (Primary)) |
<a name="line-693"></a>              Abs Primary                   |
<a name="line-694"></a>              Not Primary
<a name="line-695"></a> deriving Show
<a name="line-696"></a>
<a name="line-697"></a>-- primary
<a name="line-698"></a>-- Only literals, names and function calls  are allowed
<a name="line-699"></a>data Primary = PrimName  VHDLName    |
<a name="line-700"></a>               PrimLit   Literal |
<a name="line-701"></a>               PrimFCall FCall
<a name="line-702"></a> deriving Show
<a name="line-703"></a>
<a name="line-704"></a>-- literal
<a name="line-705"></a>-- Literals are expressed as a string (remember we are generating
<a name="line-706"></a>-- code, not parsing)
<a name="line-707"></a>type Literal = String
<a name="line-708"></a>
<a name="line-709"></a>-- function_call
<a name="line-710"></a>data FCall = FCall VHDLName [AssocElem]
<a name="line-711"></a> deriving Show
<a name="line-712"></a>-}</span>
</pre></body>
</html>