Source code for utils.VerilogParser
import re
from pathlib import Path
from core.benchmarks.Formula import Formula, VerilogFormula
from core.expressions.BooleanExpression import BooleanExpression
[docs]
class VerilogModule:
def __init__(self):
self.module_name = None
self.inputs = None
self.wires = None
self.outputs = None
self.functions = None
def __copy__(self):
verilog_module = VerilogModule()
verilog_module.module_name = self.module_name
verilog_module.inputs = self.inputs
verilog_module.outputs = self.outputs
verilog_module.functions = self.functions
return verilog_module
[docs]
def copy(self):
return self.__copy__()
[docs]
class VerilogParser:
def __init__(self, file_path: Path):
self.verilog_module = VerilogModule()
with open(file_path, 'r') as f:
content = f.read()
# TODO: Find a better solution for handling these arrays
content = content.replace('\\', '').replace('[', '').replace(']', '')
matches = re.findall(r'module\s+(.+)\s+\(', content)
module_name = matches[0].replace(' ', '')
match = re.search(r'input([.\r\n]*[^;])+', content)
if match is None:
all_input_variables = set()
else:
raw_input_variables = match.group()
all_input_variables = raw_input_variables.replace('input', '').replace('\n', ' ').replace(' ', '').split(
',')
match = re.search(r'output([.\r\n]*[^;])+', content)
raw_output_variables = match.group()
output_variables = raw_output_variables.replace('output', '').replace('\n', ' ').replace(' ', '').split(',')
match = re.search(r'wire([.\r\n]*[^;])+', content)
if match:
raw_auxiliary_variables = match.group()
auxiliary_variables = raw_auxiliary_variables.replace('wire', '').replace('\n', ' ').replace(' ', '').split(
',')
else:
auxiliary_variables = []
assignments = re.findall(r'assign\s+(.+)\s+=\s+(.+);', content)
functions = dict()
for assignment in assignments:
(raw_function_name, raw_formula) = assignment
function_name = raw_function_name.replace(' ', '')
input_variables = []
for input_variable in all_input_variables:
if input_variable in raw_formula:
input_variables.append(input_variable)
for auxiliary_variable in auxiliary_variables:
if auxiliary_variable in raw_formula:
input_variables.append(auxiliary_variable)
verilog = VerilogFormula()
verilog.output = function_name
verilog.boolean_expression = BooleanExpression.read(raw_formula)
formula = Formula(verilog)
functions[function_name] = formula
self.verilog_module.module_name = module_name
self.verilog_module.inputs = all_input_variables
self.verilog_module.wires = auxiliary_variables
self.verilog_module.outputs = output_variables
self.verilog_module.functions = functions