Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
shtaxxx committed Nov 19, 2019
2 parents 5ae53c8 + 02b2b7b commit edba020
Show file tree
Hide file tree
Showing 13 changed files with 103 additions and 94 deletions.
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ language: python
sudo: false

python:
- 3.6
- 3.7

addons:
apt:
packages:
- iverilog

install:
- pip install jinja2 pytest pytest-pythonpath
- pip install pytest pytest-pythonpath jinja2

script:
- python -m pytest tests
25 changes: 11 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,20 +71,13 @@ To write a testing code, please refer the existing testing examples in "tests" d
If the pull request code passes all the tests successfully and has no obvious problem, it will be merged to the *develop* branch by the main committers.


Documentation
==============================

To be described.


Installation
==============================

Requirements
--------------------

- Python3: 3.6 or later

- Icarus Verilog: 10.1 or later

```
Expand All @@ -97,23 +90,27 @@ sudo apt install iverilog
pip3 install jinja2
```

Optional Installation
Optional installation for testing
--------------------

- pytest: 3.2 or later
- pytest-pythonpath: 0.7 or later
These are required for automatic testing of **tests**.
We recommend to install these testing library to verify experimental features.

These are required for the testing execution of test codes in tests and examples.
- pytest: 3.8.1 or later
- pytest-pythonpath: 0.7.3 or later

```
pip3 install pytest pytest-pythonpath
```

- Graphviz: 2.38.0 or later
- Pygraphviz: 1.3.1 or later
Optional installation for visualization
--------------------

These are required for graph visualization by dataflow/graphgen.py and controlflow/controlflow_analyzer.py.

- Graphviz: 2.38.0 or later
- Pygraphviz: 1.3.1 or later

```
sudo apt install graphviz
pip3 install pygraphviz
Expand All @@ -122,7 +119,7 @@ pip3 install pygraphviz
Install
--------------------

Install Pyverilog:
Now you can install Pyverilog using setup.py script:

```
python3 setup.py install
Expand Down
27 changes: 12 additions & 15 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -81,19 +81,13 @@ If the pull request code passes all the tests successfully and has no
obvious problem, it will be merged to the *develop* branch by the main
committers.

Documentation
=============

To be described.

Installation
============

Requirements
------------

- Python3: 3.6 or later

- Icarus Verilog: 10.1 or later

::
Expand All @@ -106,25 +100,28 @@ Requirements

pip3 install jinja2

Optional Installation
---------------------
Optional installation for testing
---------------------------------

- pytest: 3.2 or later
- pytest-pythonpath: 0.7 or later
These are required for automatic testing of **tests**. We recommend to
install these testing library to verify experimental features.

These are required for the testing execution of test codes in tests and
examples.
- pytest: 3.8.1 or later
- pytest-pythonpath: 0.7.3 or later

::

pip3 install pytest pytest-pythonpath

- Graphviz: 2.38.0 or later
- Pygraphviz: 1.3.1 or later
Optional installation for visualization
---------------------------------------

These are required for graph visualization by dataflow/graphgen.py and
controlflow/controlflow_analyzer.py.

- Graphviz: 2.38.0 or later
- Pygraphviz: 1.3.1 or later

::

sudo apt install graphviz
Expand All @@ -133,7 +130,7 @@ controlflow/controlflow_analyzer.py.
Install
-------

Install Pyverilog:
Now you can install Pyverilog using setup.py script:

::

Expand Down
32 changes: 16 additions & 16 deletions pyverilog/dataflow/bindvisitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -694,9 +694,9 @@ def getTermWidth(self, name):
term = self.dataflow.getTerm(name)
return term.msb, term.lsb

def getTermShape(self, name):
def getTermDims(self, name):
term = self.dataflow.getTerm(name)
return term.shape
return term.dims

def getTermtype(self, name):
term = self.dataflow.getTerm(name)
Expand All @@ -708,7 +708,7 @@ def getBindlist(self, name):
def renameVar(self, name):
renamedvar = (name[:-1] +
ScopeLabel('_rn' + str(self.renamecnt) +
'_' + name[-1].scopename, 'signal'))
'_' + name[-1].scopename, 'signal'))
self.renamecnt += 1
return renamedvar

Expand Down Expand Up @@ -866,16 +866,16 @@ def addTerm(self, node, rscope=None):
msb = DFIntConst('0') if node.width is None else self.makeDFTree(node.width.msb, scope)
lsb = DFIntConst('0') if node.width is None else self.makeDFTree(node.width.lsb, scope)

shape = None
dims = None
if node.dimensions is not None:
shape = []
dims = []
for length in node.dimensions.lengths:
l = self.makeDFTree(length.msb, scope)
r = self.makeDFTree(length.lsb, scope)
shape.append((l, r))
shape = tuple(shape)
dims.append((l, r))
dims = tuple(dims)

term = Term(name, termtypes, msb, lsb, shape)
term = Term(name, termtypes, msb, lsb, dims)
self.dataflow.addTerm(name, term)
self.setConstantTerm(name, term)

Expand Down Expand Up @@ -1057,7 +1057,7 @@ def makeDFTree(self, node, scope):
var_df = self.makeDFTree(node.var, scope)
ptr_df = self.makeDFTree(node.ptr, scope)

if isinstance(var_df, DFTerminal) and self.getTermShape(var_df.name) is not None:
if isinstance(var_df, DFTerminal) and self.getTermDims(var_df.name) is not None:
return DFPointer(var_df, ptr_df)
return DFPartselect(var_df, ptr_df, copy.deepcopy(ptr_df))

Expand Down Expand Up @@ -1247,7 +1247,7 @@ def resolveBlockingAssign(self, tree, scope):
if isinstance(tree, DFPointer):
resolved_ptr = self.resolveBlockingAssign(tree.ptr, scope)
if (isinstance(tree.var, DFTerminal) and
self.getTermShape(tree.var.name) is not None):
self.getTermDims(tree.var.name) is not None):
current_bindlist = self.frames.getBlockingAssign(tree.var.name, scope)
if len(current_bindlist) == 0:
return DFPointer(tree.var, resolved_ptr)
Expand All @@ -1273,7 +1273,7 @@ def getFitTree(self, bindlist, msb, lsb):
if bind.msb is None and bind.lsb is None:
return bind.tree
if (self.optimize(bind.msb) == optimized_msb and
self.optimize(bind.lsb) == optimized_lsb):
self.optimize(bind.lsb) == optimized_lsb):
return bind.tree
return self.getMergedTree(bindlist)

Expand Down Expand Up @@ -1384,7 +1384,7 @@ def getDst(self, left, scope):
if left.var.scope is not None:
name = left.var.scope + ScopeLabel(left.var.name, 'signal')
ptr = self.optimize(self.makeDFTree(left.ptr, scope))
if self.getTermShape(name) is not None:
if self.getTermDims(name) is not None:
return (name, None, None, ptr)
return (name, ptr, copy.deepcopy(ptr), None)

Expand Down Expand Up @@ -1480,8 +1480,8 @@ def makeBind(self, name, msb, lsb, ptr, part_msb, part_lsb,
if len(current_bindlist) > 0:
for current_bind in current_bindlist:
if (current_bind.msb == msb and
current_bind.lsb == lsb and
current_bind.ptr == ptr ):
current_bind.lsb == lsb
and current_bind.ptr == ptr ):
current_tree = current_bind.tree
current_msb = current_bind.msb
current_lsb = current_bind.lsb
Expand All @@ -1494,8 +1494,8 @@ def makeBind(self, name, msb, lsb, ptr, part_msb, part_lsb,

match_flowlist = ()
if (current_msb == msb and
current_lsb == lsb and
current_ptr == ptr ):
current_lsb == lsb
and current_ptr == ptr ):
(rest_tree,
rest_condlist,
rest_flowlist,
Expand Down
22 changes: 11 additions & 11 deletions pyverilog/dataflow/dataflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -687,12 +687,12 @@ def __hash__(self):


class Term(object):
def __init__(self, name, termtype=(), msb=None, lsb=None, shape=None):
def __init__(self, name, termtype=(), msb=None, lsb=None, dims=None):
self.name = name # tuple (str)
self.termtype = termtype # set (str)
self.msb = msb # DFNode
self.lsb = lsb # DFNode
self.shape = shape # tuple/list of pair of DFNode
self.dims = dims # tuple/list of pair of DFNode

def __repr__(self):
return str(self.name)
Expand All @@ -704,10 +704,10 @@ def tostr(self):
ret += ' msb:' + self.msb.tostr()
if self.lsb is not None:
ret += ' lsb:' + self.lsb.tostr()
if self.shape is not None:
ret += ' shape:'
if self.dims is not None:
ret += ' dims:'
ret += ''.join(['[' + l.tostr() + ':' + r.tostr() + ']'
for l, r in self.shape])
for l, r in self.dims])
ret += ')'
return ret

Expand All @@ -721,10 +721,10 @@ def __eq__(self, other):
and self.termtype == other.termtype
and self.msb == other.msb
and self.lsb == other.lsb
and self.shape == other.shape)
and self.dims == other.dims)

def __hash__(self):
return hash((self.name, self.termtype, self.msb, self.lsb, self.shape))
return hash((self.name, self.termtype, self.msb, self.lsb, self.dims))

def getScope(self, termname):
return termname[:-1]
Expand Down Expand Up @@ -768,9 +768,9 @@ def tocode(self):
and self.msb is not None and self.lsb is not None):
code += '[' + self.msb.tocode(None) + ':' + self.lsb.tocode(None) + '] '
code += flatname # signal name
if self.shape is not None:
if self.dims is not None:
code += ''.join(['[' + l.tocode() + ':' + r.tocode() + ']'
for l, r in self.shape])
for l, r in self.dims])
code += ';\n'
return code

Expand Down Expand Up @@ -969,8 +969,8 @@ def setTerm(self, name, term):
self.terms[name].msb = term.msb
if self.terms[name].lsb is None:
self.terms[name].lsb = term.lsb
if self.terms[name].shape is None:
self.terms[name].shape = term.shape
if self.terms[name].dims is None:
self.terms[name].dims = term.dims

def hasTerm(self, name):
return name in self.terms
Expand Down
12 changes: 6 additions & 6 deletions pyverilog/dataflow/merge.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ def getTermtype(self, termname):
raise verror.DefinitionError('No such Term: %s' % termname)
return term.termtype

def getTermShape(self, termname):
def getTermDims(self, termname):
term = self.getTerm(termname)
if term is None:
raise verror.DefinitionError('No such Term: %s' % termname)
return term.shape
return term.dims

def getAssignType(self, termname, bind):
termtype = self.getTermtype(termname)
Expand Down Expand Up @@ -115,7 +115,7 @@ def getTree(self, termname, ptr=None):
if len(bindlist) == 0:
return None

if self.getTermShape(termname) is not None:
if self.getTermDims(termname) is not None:
discretebinds = {}
for bind in bindlist:
if isinstance(bind.ptr, DFEvalValue):
Expand Down Expand Up @@ -221,8 +221,8 @@ def getTermSources(self, termname):
sources = set()
sources |= self.getTreeSources(term.msb)
sources |= self.getTreeSources(term.lsb)
if term.shape is not None:
for l, r in term.shape:
if term.dims is not None:
for l, r in term.dims:
sources |= self.getTreeSources(l)
sources |= self.getTreeSources(r)
return sources
Expand Down Expand Up @@ -416,7 +416,7 @@ def splitBind(self, bind, splitpos):
lsb = self.optimizer.optimizeConstant(bind.lsb)
ptr = self.optimizer.optimizeConstant(bind.ptr)
if ptr is not None and msb is None or lsb is None:
if self.getTermShape(bind.dest) is not None:
if self.getTermDims(bind.dest) is not None:
msb = self.optimizer.optimizeConstant(copy.deepcopy(term.msb))
lsb = self.optimizer.optimizeConstant(copy.deepcopy(term.lsb))
else:
Expand Down
14 changes: 7 additions & 7 deletions pyverilog/dataflow/optimizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ def optimizeConstant(self, tree):
term = self.getTerm(tree.var.name)
var = self.optimizeConstant(tree.var)
ptr = self.optimizeConstant(tree.ptr)
if term.shape is not None:
if term.dims is not None:
return DFPointer(var, ptr)
if isinstance(var, DFEvalValue) and isinstance(ptr, DFEvalValue):
evalcc = self.evalPointer(var, ptr)
Expand Down Expand Up @@ -335,7 +335,7 @@ def getWidth(self, node):
if not isinstance(node.var, DFTerminal):
return 1
term = self.getTerm(node.var.name)
if term.shape is not None:
if term.dims is not None:
msb = self.optimizeConstant(term.msb).value
lsb = self.optimizeConstant(term.lsb).value
width = abs(msb - lsb) + 1
Expand Down Expand Up @@ -1023,10 +1023,10 @@ def resolveConstant(self):
if tv.lsb is not None:
rslt = self.optimizeConstant(tv.lsb)
self.resolved_terms[tk].lsb = rslt
if tv.shape is not None:
shape = []
for l, r in tv.shape:
if tv.dims is not None:
dims = []
for l, r in tv.dims:
l = self.optimizeConstant(l)
r = self.optimizeConstant(r)
shape.append((l, r))
self.resolved_terms[tk].shape = tuple(shape)
dims.append((l, r))
self.resolved_terms[tk].dims = tuple(dims)
Loading

0 comments on commit edba020

Please sign in to comment.