| # ------------------------------------------------------------------------------- |
| # 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 |