diff --git a/pyverilog/dataflow/dataflow.py b/pyverilog/dataflow/dataflow.py index 0ecebfe..27f20ec 100644 --- a/pyverilog/dataflow/dataflow.py +++ b/pyverilog/dataflow/dataflow.py @@ -399,6 +399,8 @@ def tocode(self, dest='dest'): def children(self): nodelist = [] return tuple(nodelist) + def eval(self): + return self.value def __eq__(self, other): if type(self) != type(other): return False return self.value == other.value and self.width == other.width and self.isfloat == other.isfloat and self.isstring == other.isstring diff --git a/pyverilog/dataflow/merge.py b/pyverilog/dataflow/merge.py index ed9b038..692671c 100644 --- a/pyverilog/dataflow/merge.py +++ b/pyverilog/dataflow/merge.py @@ -33,6 +33,9 @@ def __init__(self, topmodule, terms, binddict, resolved_terms, resolved_binddict ############################################################################ def getTerm(self, termname): + if isinstance(termname, str): + for scope in self.terms.keys(): + if termname == str(scope): return self.terms[scope] if not termname in self.terms: return None return self.terms[termname] diff --git a/pyverilog/dataflow/walker.py b/pyverilog/dataflow/walker.py index d25cf00..81fc19d 100644 --- a/pyverilog/dataflow/walker.py +++ b/pyverilog/dataflow/walker.py @@ -99,6 +99,10 @@ def walkTree(self, tree, visited=set([]), step=0, delay=False, msb=None, lsb=Non msb = self.walkTree(tree.msb, visited, step, delay) lsb = self.walkTree(tree.lsb, visited, step, delay) var = self.walkTree(tree.var, visited, step, delay, msb=msb, lsb=lsb) + if isinstance(var, DFPartselect): + child_lsb = self.getTerm(str(tree.var)).lsb.eval() + return DFPartselect(var.var, DFIntConst(str(msb.eval() + var.lsb.eval() - child_lsb)), + DFIntConst(str(lsb.eval() + var.lsb.eval() - child_lsb))) return DFPartselect(var, msb, lsb) if isinstance(tree, DFPointer): diff --git a/testcode/partselect_assign.v b/testcode/partselect_assign.v new file mode 100644 index 0000000..5579213 --- /dev/null +++ b/testcode/partselect_assign.v @@ -0,0 +1,25 @@ +module TOP(CLK, RST, reg1, OUT); + input CLK, RST; + reg [1:0] reg1; + reg [6:4] reg3; + wire [2:1] in1; + wire [11:10] in2; + + + assign in1[2:1] = reg3[6:5]; + + always @(posedge CLK or negedge RST) begin + reg1 <= in1[2:1]; + end + + always @(posedge CLK or negedge RST) begin + if(RST) begin + reg3 <= 3'd0; + end else begin + reg3 <= 3'd1; + end + end + +endmodule + + diff --git a/tests/dataflow_test/test_partselect_assign.py b/tests/dataflow_test/test_partselect_assign.py new file mode 100644 index 0000000..880abb6 --- /dev/null +++ b/tests/dataflow_test/test_partselect_assign.py @@ -0,0 +1,59 @@ +import os +import sys +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) ) +from pyverilog.dataflow.dataflow_analyzer import VerilogDataflowAnalyzer +from pyverilog.dataflow.optimizer import VerilogDataflowOptimizer +from pyverilog.controlflow.controlflow_analyzer import VerilogControlflowAnalyzer +codedir = '../../testcode/' + +expected = """\ +TOP.RST: TOP_RST +TOP.reg1: TOP_reg3['d6:'d5] +TOP.in2: TOP_in2 +TOP.CLK: TOP_CLK +TOP.reg3: ((TOP_RST)? 3'd0 : 3'd1) +TOP.in1: TOP_reg3['d6:'d5] +""" + +def test(): + filelist = [codedir + 'partselect_assign.v'] + topmodule = 'TOP' + noreorder = False + nobind = False + include = None + define = None + + analyzer = VerilogDataflowAnalyzer(filelist, topmodule, + noreorder=noreorder, + nobind=nobind, + preprocess_include=include, + preprocess_define=define) + analyzer.generate() + + directives = analyzer.get_directives() + instances = analyzer.getInstances() + terms = analyzer.getTerms() + binddict = analyzer.getBinddict() + + optimizer = VerilogDataflowOptimizer(terms, binddict) + optimizer.resolveConstant() + + c_analyzer = VerilogControlflowAnalyzer(topmodule, terms, + binddict, + resolved_terms=optimizer.getResolvedTerms(), + resolved_binddict=optimizer.getResolvedBinddict(), + constlist=optimizer.getConstlist() + ) + + output = [] + for tk in sorted(c_analyzer.resolved_terms.keys(), key=lambda x:str(x[0])): + tree = c_analyzer.makeTree(tk) + output.append(str(tk) + ': ' + tree.tocode()) + + rslt = '\n'.join(output) + '\n' + + print(rslt) + assert(rslt == expected) + +if __name__ == '__main__': + test()