PyHDI / Pyverilog

Python-based Hardware Design Processing Toolkit for Verilog HDL
Apache License 2.0
640 stars 180 forks source link

ParseError for User Defined Primitives #113

Open TheMatt2 opened 2 years ago

TheMatt2 commented 2 years ago

It seems that Verilog user defined primitives are not supported by this parser.

If I put in an example with a user defined primitive, I get an error message.

primitive udp_and (c, a, b);
    output c;
    input a, b;

// in0 in1 sel :  out
    table
//      a b  c
        0 ?: 0;
        ? 0: 0;
        1 1: 1;
   endtable
endprimitive

Using the example parser, I get the following error message:

$ python3 example_parser.py udp_and.v 
Generating LALR tables
WARNING: 183 shift/reduce conflicts
Traceback (most recent call last):
  File "example_parser.py", line 55, in <module>
    main()
  File "example_parser.py", line 45, in main
    ast, directives = parse(filelist,
  File "/usr/local/lib/python3.10/dist-packages/pyverilog/vparser/parser.py", line 2338, in parse
    ast = codeparser.parse()
  File "/usr/local/lib/python3.10/dist-packages/pyverilog/vparser/parser.py", line 2316, in parse
    ast = self.parser.parse(text, debug=debug)
  File "/usr/local/lib/python3.10/dist-packages/pyverilog/vparser/parser.py", line 77, in parse
    return self.parser.parse(text, lexer=self.lexer, debug=debug)
  File "/usr/local/lib/python3.10/dist-packages/ply/yacc.py", line 333, in parse
    return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
  File "/usr/local/lib/python3.10/dist-packages/ply/yacc.py", line 1201, in parseopt_notrack
    tok = call_errorfunc(self.errorfunc, errtoken, self)
  File "/usr/local/lib/python3.10/dist-packages/ply/yacc.py", line 192, in call_errorfunc
    r = errorfunc(token)
  File "/usr/local/lib/python3.10/dist-packages/pyverilog/vparser/parser.py", line 2268, in p_error
    self._raise_error(p)
  File "/usr/local/lib/python3.10/dist-packages/pyverilog/vparser/parser.py", line 2279, in _raise_error
    raise ParseError("%s: %s" % (coord, msg))
pyverilog.vparser.parser.ParseError:  line:1: before: "primitive"
shtaxxx commented 2 years ago

Sorry, the current version of Pyverilog does not support primitive. I think the modification of AST parser is not so difficult if add this feature based on the current parsing function for module.