<?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'>-></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'>-></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'>-></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'>-></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'>&&</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'>-></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 \"#&\\'()*+,./:;<=>_|!$%@?[^`{}~-]+$"</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'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></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'>'&'</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'>'<'</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-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'>:=>:</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'>:<==:</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'>:<:</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'>:<=:</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'>:>:</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'>:>=:</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'>:&:</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'>:<:</span><span class='hs-layout'>,</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'>:>=:</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'>:&:</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>