Source code for frontend.reader.verilogReader.reader

#
# Copyright (c) 2018-2021 T. {Benz,Kramer}.
#
# This file is part of verilog-parser
# (see https://codeberg.org/tok/py-verilog-parser).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
from lark import Lark

# http://www.verilog.com/VerilogBNF.html
# http://www.externsoft.ch/download/verilog.html

from ...modules import *
from .verilogTransformer import VerilogTransformer

GRAMMAR_FILE = "grammar_systemverilog.lark"


def transformVerilogToNetlist(data: str) -> Netlist:
    """
    Parse a string containing data of a verilog file.
    :param data: Raw verilog string.
    :return:
    """
    ast = parseVerilogToAST(data)

    # select the transformer
    transformer = VerilogTransformer()
    netlist = transformer.transform(ast)

    return netlist


def parseVerilogToAST(data: str) -> Netlist:
    import os

    curr_dir = os.path.dirname(os.path.abspath(__file__))
    grammar_file = os.path.join(curr_dir, GRAMMAR_FILE)
    with open(grammar_file, "r") as f:
        verilog_netlist_grammar = f.read()

    parser = Lark(verilog_netlist_grammar, parser="earley", lexer="dynamic_complete")
    parseTree = parser.parse(data)

    # return the netlist
    return parseTree


# reference: https://codeberg.org/tok/py-verilog-parser/src/branch/master/verilog_parser/parser.py
[docs]def readVerilog(filename: str) -> Netlist: """Read the verilog from a file and return the netlist. :param filename: the name of the file to read :type filename: str :raises FileNotFoundError: if the file does not exist :return: the netlist :rtype: Netlist """ import os if not os.path.exists(filename): raise FileNotFoundError(f"file {filename} not found") with open(filename, "r") as f: data = f.read() return transformVerilogToNetlist(data)