Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pyverilog/dataflow/dataflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions pyverilog/dataflow/merge.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down
4 changes: 4 additions & 0 deletions pyverilog/dataflow/walker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
25 changes: 25 additions & 0 deletions testcode/partselect_assign.v
Original file line number Diff line number Diff line change
@@ -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


59 changes: 59 additions & 0 deletions tests/dataflow_test/test_partselect_assign.py
Original file line number Diff line number Diff line change
@@ -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()