Skip to content

Commit 5e42609

Browse files
committed
Merge pull request #17 from fukatani/master
"Change behavior of walkey.makeTree for assign statement using partselect" Thanks! It has been merged.
2 parents 6eb2d50 + 5164b2a commit 5e42609

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
@@ -399,6 +399,8 @@ def tocode(self, dest='dest'):
399399
def children(self):
400400
nodelist = []
401401
return tuple(nodelist)
402+
def eval(self):
403+
return self.value
402404
def __eq__(self, other):
403405
if type(self) != type(other): return False
404406
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
@@ -33,6 +33,9 @@ def __init__(self, topmodule, terms, binddict, resolved_terms, resolved_binddict
3333

3434
############################################################################
3535
def getTerm(self, termname):
36+
if isinstance(termname, str):
37+
for scope in self.terms.keys():
38+
if termname == str(scope): return self.terms[scope]
3639
if not termname in self.terms: return None
3740
return self.terms[termname]
3841

pyverilog/dataflow/walker.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ def walkTree(self, tree, visited=set([]), step=0, delay=False, msb=None, lsb=Non
9999
msb = self.walkTree(tree.msb, visited, step, delay)
100100
lsb = self.walkTree(tree.lsb, visited, step, delay)
101101
var = self.walkTree(tree.var, visited, step, delay, msb=msb, lsb=lsb)
102+
if isinstance(var, DFPartselect):
103+
child_lsb = self.getTerm(str(tree.var)).lsb.eval()
104+
return DFPartselect(var.var, DFIntConst(str(msb.eval() + var.lsb.eval() - child_lsb)),
105+
DFIntConst(str(lsb.eval() + var.lsb.eval() - child_lsb)))
102106
return DFPartselect(var, msb, lsb)
103107

104108
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)