blob: 1450d22f91dac03b01e30191e7fd49c5998e7ec5 [file] [log] [blame]
# -------------------------------------------------------------------------------
# dataflow_analyzer.py
#
# Verilog module signal/module dataflow analyzer
#
# Copyright (C) 2013, Shinya Takamaeda-Yamazaki
# License: Apache 2.0
# -------------------------------------------------------------------------------
from __future__ import absolute_import
from __future__ import print_function
import sys
import os
from pyverilog.vparser.parser import VerilogCodeParser
from pyverilog.dataflow.modulevisitor import ModuleVisitor
from pyverilog.dataflow.signalvisitor import SignalVisitor
from pyverilog.dataflow.bindvisitor import BindVisitor
# Increasing the maximum recursion size for deeper traversal
sys.setrecursionlimit(16 * 1024)
class VerilogDataflowAnalyzer(VerilogCodeParser):
def __init__(self, filelist, topmodule='TOP', noreorder=False, nobind=False,
preprocess_include=None,
preprocess_define=None):
self.topmodule = topmodule
self.terms = {}
self.binddict = {}
self.frametable = None
files = filelist if isinstance(filelist, tuple) or isinstance(
filelist, list) else [filelist]
VerilogCodeParser.__init__(self, files,
preprocess_include=preprocess_include,
preprocess_define=preprocess_define)
self.noreorder = noreorder
self.nobind = nobind
def generate(self):
ast = self.parse()
module_visitor = ModuleVisitor()
module_visitor.visit(ast)
modulenames = module_visitor.get_modulenames()
moduleinfotable = module_visitor.get_moduleinfotable()
signal_visitor = SignalVisitor(moduleinfotable, self.topmodule)
signal_visitor.start_visit()
frametable = signal_visitor.getFrameTable()
if self.nobind:
self.frametable = frametable
return
bind_visitor = BindVisitor(moduleinfotable, self.topmodule, frametable,
noreorder=self.noreorder)
bind_visitor.start_visit()
dataflow = bind_visitor.getDataflows()
self.frametable = bind_visitor.getFrameTable()
self.terms = dataflow.getTerms()
self.binddict = dataflow.getBinddict()
def getFrameTable(self):
return self.frametable
# -------------------------------------------------------------------------
def getInstances(self):
if self.frametable is None:
return ()
return self.frametable.getAllInstances()
def getSignals(self):
if self.frametable is None:
return ()
return self.frametable.getAllSignals()
def getConsts(self):
if self.frametable is None:
return ()
return self.frametable.getAllConsts()
def getTerms(self):
return self.terms
def getBinddict(self):
return self.binddict