
\begin{verbatim}

circuit : hdr clocks gates primary_inputs primary_outputs
        ;

hdr : nl
    |
    ;

nl : NL
   | nl NL
   ;

clocks : CLOCKS nl clock_list
       |
       ;

clock_list : clock
           | clock_list clock
           ;

clock : NAME nl
      ;

gates : GATES nl gate_list
      ;

gate_list : gate 
          | gate_list gate
          ;

gate : gate_name gate_type nl
     ;

gate_name : NAME 
          ;

gate_type : DFF ff_lines d q qbar delay
          | JKFF ff_lines j k q qbar delay
          | AND oi_list delay
          | OR oi_list delay
          | INV oi_list delay
          | NAND oi_list delay
          | NOR oi_list delay
          | XOR oi_list delay
          | BUF io_list delay
          ;

ff_lines : clock_line preset_line reset_line 
         ;

clock_line : NAME
           ;

preset_line : PL NAME
            |  
            ;

reset_line : RL NAME
           |
           ;

d : NAME
  ;

q : Q NAME
  |
  ;

qbar : QB NAME
     |
     ;

j : NAME
  ;

k : NAME
  ;

delay : rise fall setup hold
      ;

rise : RISE NUM
     |
     ;

fall : FALL NUM
     |
     ;

setup : SETUP NUM
      |
      ;

hold : HOLD NUM
     |
     ;

oi_list : output_line input_list
        ;

output_line : NAME
            ;

input_list : line_name 
           | input_list line_name
           ;

line_name : NAME
          ;

io_list : input_line output_list
        ;

input_line : NAME
           ;

output_list : line_name 
            | output_list line_name
            ;

primary_inputs : pi_head nl pi_list
               ;

pi_head : PRIMARY INPUTS 
            }
        ;

pi_list : pi_name pi_line nl 
        | pi_list pi_name pi_line nl
        ;

pi_name : NAME 
        ;

pi_line : NAME
        ;

primary_outputs : po_head nl po_list end
                ;

po_head : PRIMARY OUTPUTS 
        ;

po_list : po_name po_line nl 
        | po_list po_name po_line nl
        ;

po_name : NAME 
        ;

po_line : NAME
        ;

end : END nl
    ;

\end{verbatim}
