Skip to content

Commit 71138aa

Browse files
committed
Pyverilog 0.6.0 for public.
0 parents  commit 71138aa

File tree

184 files changed

+17580
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

184 files changed

+17580
-0
lines changed

Makefile

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
.PHONY: all
2+
all:
3+
make -C ./vparser
4+
make -C ./definition_analyzer
5+
make -C ./definition_resolver
6+
make -C ./optimizer
7+
make -C ./tree_constructor
8+
make -C ./tree_walker
9+
make -C ./graph
10+
make -C ./subset
11+
make -C ./codegen
12+
make -C ./controlflow
13+
make -C ./active_condition
14+
make -C ./ast_to_code
15+
16+
.PHONY: clean
17+
clean:
18+
make clean -C ./utils
19+
make clean -C ./vparser
20+
make clean -C ./definition_analyzer
21+
make clean -C ./definition_resolver
22+
make clean -C ./optimizer
23+
make clean -C ./tree_constructor
24+
make clean -C ./tree_walker
25+
make clean -C ./graph
26+
make clean -C ./subset
27+
make clean -C ./codegen
28+
make clean -C ./controlflow
29+
make clean -C ./active_condition
30+
make clean -C ./ast_to_code
31+
rm -rf *.pyc __pycache__ *.out parsetab.py *.html

README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
Pyverilog
2+
==============================
3+
Python-based Tool-chain for design analysis and code generation of Verilog HDL
4+
5+
Copyright (C) 2013, Shinya Takamaeda-Yamazaki
6+
7+
E-mail: takamaeda\_at\_arch.cs.titech.ac.jp
8+
9+
License
10+
------------------------------
11+
Apache License 2.0
12+
(http://www.apache.org/licenses/LICENSE-2.0)
13+
14+
15+
This software package includes PLY-3.4 in "vparser/ply".
16+
The license of PLY is BSD.
17+
18+
19+
What's Pyverilog?
20+
------------------------------
21+
22+
Pyverilog is open-source design analyzer/generator of Verilog HDL. All source codes are written in Python.
23+
24+
Pyverilog includes various independent software tools for Verilog HDL.
25+
You can create your own design analyzer, code translator and code generator for Verilog HDL based on this tool-chain.
26+
27+
28+
Software Requirements
29+
------------------------------
30+
31+
* Python (2.7 and 3.3 or later)
32+
- 'controlflow' and 'graph' use Python 2.7 to generate a graph image using python-graphviz
33+
* Jinja2 (2.7 or later)
34+
- pip3 install jinja2
35+
* Icarus Verilog (0.9.6 or later)
36+
- apt-get install iverilog
37+
38+
39+
Getting Started
40+
------------------------------
41+
42+
This software includes various tools for Verilog HDL design.
43+
44+
Most useful tools are
45+
46+
* vparser: Code parser to generate AST (Abstract Syntax Tree) from source codes of Verilog HDL.
47+
* definition\_analyzer: Dataflow analyzer.
48+
* optimizer: Definition optimizer to remove redundant expressions.
49+
* ast\_to\_code: Code generator of Verilog HDL from AST
50+
51+
The other tools are useful for control-flow analysis and active value inference to generate some accelerated logics.
52+
53+
To use them, plase type just 'make' in each sub directory.
54+

__init__.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import sys
2+
if sys.version_info[0] < 3:
3+
import utils
4+
import vparser
5+
import definition_analyzer
6+
import definition_resolver
7+
import optimizer
8+
import tree_constructor
9+
import tree_walker
10+
import graph
11+
import subset
12+
import codegen
13+
import controlflow
14+
import active_condition
15+
#import ast_to_code # Python 2.x does not support

active_condition/Makefile

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
PYTHON=python3.3
2+
#OPT=-m pdb
3+
4+
ACTIVE=active_condition.py
5+
SRCS=../test/vectoradd.v
6+
TOP=-t TOP
7+
TARGETS=-s "TOP.MEM_RE"
8+
9+
.PHONY: active
10+
active:
11+
$(PYTHON) $(OPT) $(ACTIVE) $(TOP) $(SRCS) $(TARGETS)
12+
13+
.PHONY: clean
14+
clean:
15+
rm -rf *.pyc __pycache__ parsetab.py *.out

active_condition/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import sys
2+
if sys.version_info[0] < 3:
3+
import active_condition
4+
import active_range

active_condition/active_condition.py

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
#-------------------------------------------------------------------------------
2+
# active_condition.py
3+
#
4+
# Active condition list generator from Verilog Definitions with Pyverilog
5+
#
6+
# Copyright (C) 2013, Shinya Takamaeda-Yamazaki
7+
# License: Apache 2.0
8+
#-------------------------------------------------------------------------------
9+
10+
import sys
11+
import os
12+
13+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) )
14+
15+
import pyverilog.utils.version
16+
import pyverilog.utils.util as util
17+
import pyverilog.utils.tree_reorder as tree_reorder
18+
import pyverilog.utils.tree_splitter as tree_splitter
19+
import pyverilog.utils.inference as inference
20+
import pyverilog.utils.state_transition as state_transition
21+
from pyverilog.utils.dataflow import *
22+
23+
from pyverilog.controlflow.controlflow import VerilogControlflow
24+
25+
class VerilogActiveCondition(VerilogControlflow):
26+
def __init__(self, topmodule, terms, binddict,
27+
resolved_terms, resolved_binddict, constlist):
28+
VerilogControlflow.__init__(self, topmodule, terms, binddict,
29+
resolved_terms, resolved_binddict, constlist)
30+
self.fsm_loops, self.fsms = self.getLoops()
31+
32+
############################################################################
33+
def getActiveConditions(self, termname, condition=tree_splitter.active_constant):
34+
if not termname in self.resolved_binddict: return {}
35+
tree = self.makeTree(termname)
36+
funcdict = tree_splitter.split(tree)
37+
funcdict = tree_splitter.filter(funcdict, termname, condition)
38+
funcdict = tree_splitter.remove_reset_condition(funcdict)
39+
40+
if len(funcdict) == 1 and len(list(funcdict.keys())[0]) == 0:
41+
func = funcdict.values()[0]
42+
return {termname : ( ('any', None), )}
43+
44+
active_conditions = {}
45+
active_conditions_size = 0
46+
for fsm_sig in self.fsms.keys():
47+
rslt = self.getActiveConditions_fsm(fsm_sig, funcdict)
48+
if len(rslt) > 0: active_conditions[fsm_sig] = rslt
49+
active_conditions_size += len(rslt)
50+
51+
if active_conditions_size == 0:
52+
rslt = self.getActiveConditions_fsm(termname, funcdict)
53+
if len(rslt) > 0: active_conditions[termname] = rslt
54+
55+
return active_conditions
56+
57+
def getActiveConditions_fsm(self, fsm_sig, funcdict):
58+
# returns a list of some (state, transcond) pairs
59+
active_conditions = []
60+
fsm_sig_width = self.getWidth(fsm_sig)
61+
for condlist, func in sorted(funcdict.items(), key=lambda x:len(x[0])):
62+
node = state_transition.walkCondlist(condlist, fsm_sig, fsm_sig_width)
63+
state_node_list = []
64+
if isinstance(node, state_transition.StateNodeList):
65+
for n in node.nodelist: state_node_list.append(n)
66+
elif node:
67+
state_node_list.append(node)
68+
69+
for state_node in state_node_list:
70+
#if state_node.isany:
71+
# active_conditions.append( ('any', state_node.transcond) )
72+
for rs, re in state_node.range_pairs:
73+
for state in range(rs, re+1):
74+
transcond = self.optimizer.optimize(state_node.transcond)
75+
if isinstance(transcond, DFEvalValue) and transcond.value == 0: continue
76+
active_conditions.append( (state, transcond) )
77+
return tuple(active_conditions)
78+
79+
################################################################################
80+
if __name__ == '__main__':
81+
from optparse import OptionParser
82+
from pyverilog.definition_analyzer.definition_analyzer import VerilogDefinitionAnalyzer
83+
from pyverilog.definition_resolver.definition_resolver import VerilogDefinitionResolver
84+
INFO = "Active condition analyzer for Verilog definitions with Pyverilog"
85+
VERSION = pyverilog.utils.version.VERSION
86+
USAGE = "Usage: python active_analyzer.py -t TOPMODULE file ..."
87+
88+
def showVersion():
89+
print(INFO)
90+
print(VERSION)
91+
print(USAGE)
92+
sys.exit()
93+
94+
optparser = OptionParser()
95+
optparser.add_option("-v","--version",action="store_true",dest="showversion",
96+
default=False,help="Show the version")
97+
optparser.add_option("-t","--top",dest="topmodule",
98+
default="TOP",help="Top module, Default=TOP")
99+
optparser.add_option("-s","--search",dest="searchtarget",action="append",
100+
default=[],help="Search Target Signal")
101+
(options, args) = optparser.parse_args()
102+
103+
filelist = args
104+
if options.showversion:
105+
showVersion()
106+
107+
for f in filelist:
108+
if not os.path.exists(f): raise IOError("file not found: " + f)
109+
110+
if len(filelist) == 0:
111+
showVersion()
112+
113+
verilogdefinitionanalyzer = VerilogDefinitionAnalyzer(filelist, options.topmodule)
114+
verilogdefinitionanalyzer.generate()
115+
116+
directives = verilogdefinitionanalyzer.get_directives()
117+
terms = verilogdefinitionanalyzer.getTerms()
118+
binddict = verilogdefinitionanalyzer.getBinddict()
119+
120+
verilogdefinitionresolver = VerilogDefinitionResolver(terms, binddict)
121+
122+
verilogdefinitionresolver.resolveConstant()
123+
resolved_terms = verilogdefinitionresolver.getResolvedTerms()
124+
resolved_binddict = verilogdefinitionresolver.getResolvedBinddict()
125+
constlist = verilogdefinitionresolver.getConstlist()
126+
127+
active = VerilogActiveCondition(options.topmodule, terms, binddict, resolved_terms, resolved_binddict, constlist)
128+
129+
for target in options.searchtarget:
130+
signal = util.toTermname(target)
131+
active_conditions = active.getActiveConditions( signal )
132+
133+
#active_conditions = active.getActiveConditions( signal, condition=tree_splitter.active_modify )
134+
#active_conditions = active.getActiveConditions( signal, condition=tree_splitter.active_unmodify )
135+
136+
print('Active Cases: %s' % signal)
137+
for fsm_sig, active_conditions in sorted(active_conditions.items(), key=lambda x:str(x[0])):
138+
print('FSM: %s' % fsm_sig)
139+
for state, active_condition in sorted(active_conditions, key=lambda x:str(x[0])):
140+
s = []
141+
s.append('state: %d -> ' % state)
142+
if active_condition: s.append(active_condition.tocode())
143+
else: s.append('empty')
144+
print(''.join(s))

0 commit comments

Comments
 (0)