Skip to content

Commit 45c1c12

Browse files
committed
Change behavior of walkey.makeTree for assign statement using partselect, and add test(test_partselect_assign.py).
ex. assign in1[2:1] = reg3[6:5]; always @(posedge CLK) begin reg1 <= in1[2:1]; end Previous makeTree: TOP_reg3['d6:'d5]['d2] However, this output recall the two -dimensional array , it is considered not to be appropriate. Changed to: TOP_reg3['d6]
1 parent 18c04c3 commit 45c1c12

File tree

5 files changed

+93
-0
lines changed

5 files changed

+93
-0
lines changed

pyverilog/dataflow/dataflow.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ def tocode(self, dest='dest'):
398398
def children(self):
399399
nodelist = []
400400
return tuple(nodelist)
401+
def eval(self):
402+
return self.value
401403
def __eq__(self, other):
402404
if type(self) != type(other): return False
403405
return self.value == other.value and self.width == other.width and self.isfloat == other.isfloat and self.isstring == other.isstring

pyverilog/dataflow/merge.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ def __init__(self, topmodule, terms, binddict, resolved_terms, resolved_binddict
3939

4040
############################################################################
4141
def getTerm(self, termname):
42+
if isinstance(termname, str):
43+
for scope in self.terms.keys():
44+
if termname == str(scope): return self.terms[scope]
4245
if not termname in self.terms: return None
4346
return self.terms[termname]
4447

pyverilog/dataflow/walker.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ def walkTree(self, tree, visited=set([]), step=0, delay=False, msb=None, lsb=Non
107107
msb = self.walkTree(tree.msb, visited, step, delay)
108108
lsb = self.walkTree(tree.lsb, visited, step, delay)
109109
var = self.walkTree(tree.var, visited, step, delay, msb=msb, lsb=lsb)
110+
if isinstance(var, DFPartselect):
111+
child_lsb = self.getTerm(str(tree.var)).lsb.eval()
112+
return DFPartselect(var.var, DFIntConst(str(msb.eval() + var.lsb.eval() - child_lsb)),
113+
DFIntConst(str(lsb.eval() + var.lsb.eval() - child_lsb)))
110114
return DFPartselect(var, msb, lsb)
111115

112116
if isinstance(tree, DFPointer):

testcode/partselect_assign.v

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module TOP(CLK, RST, reg1, OUT);
2+
input CLK, RST;
3+
reg [1:0] reg1;
4+
reg [6:4] reg3;
5+
wire [2:1] in1;
6+
wire [11:10] in2;
7+
8+
9+
assign in1[2:1] = reg3[6:5];
10+
11+
always @(posedge CLK or negedge RST) begin
12+
reg1 <= in1[2:1];
13+
end
14+
15+
always @(posedge CLK or negedge RST) begin
16+
if(RST) begin
17+
reg3 <= 3'd0;
18+
end else begin
19+
reg3 <= 3'd1;
20+
end
21+
end
22+
23+
endmodule
24+
25+
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import os
2+
import sys
3+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) )
4+
from pyverilog.dataflow.dataflow_analyzer import VerilogDataflowAnalyzer
5+
from pyverilog.dataflow.optimizer import VerilogDataflowOptimizer
6+
from pyverilog.controlflow.controlflow_analyzer import VerilogControlflowAnalyzer
7+
codedir = '../../testcode/'
8+
9+
expected = """\
10+
TOP.RST: TOP_RST
11+
TOP.reg1: TOP_reg3['d6:'d5]
12+
TOP.in2: TOP_in2
13+
TOP.CLK: TOP_CLK
14+
TOP.reg3: ((TOP_RST)? 3'd0 : 3'd1)
15+
TOP.in1: TOP_reg3['d6:'d5]
16+
"""
17+
18+
def test():
19+
filelist = [codedir + 'partselect_assign.v']
20+
topmodule = 'TOP'
21+
noreorder = False
22+
nobind = False
23+
include = None
24+
define = None
25+
26+
analyzer = VerilogDataflowAnalyzer(filelist, topmodule,
27+
noreorder=noreorder,
28+
nobind=nobind,
29+
preprocess_include=include,
30+
preprocess_define=define)
31+
analyzer.generate()
32+
33+
directives = analyzer.get_directives()
34+
instances = analyzer.getInstances()
35+
terms = analyzer.getTerms()
36+
binddict = analyzer.getBinddict()
37+
38+
optimizer = VerilogDataflowOptimizer(terms, binddict)
39+
optimizer.resolveConstant()
40+
41+
c_analyzer = VerilogControlflowAnalyzer(topmodule, terms,
42+
binddict,
43+
resolved_terms=optimizer.getResolvedTerms(),
44+
resolved_binddict=optimizer.getResolvedBinddict(),
45+
constlist=optimizer.getConstlist()
46+
)
47+
48+
output = []
49+
for tk in sorted(c_analyzer.resolved_terms.keys(), key=lambda x:str(x[0])):
50+
tree = c_analyzer.makeTree(tk)
51+
output.append(str(tk) + ': ' + tree.tocode())
52+
53+
rslt = '\n'.join(output) + '\n'
54+
55+
print(rslt)
56+
assert(rslt == expected)
57+
58+
if __name__ == '__main__':
59+
test()

0 commit comments

Comments
 (0)