2797 lines
62 KiB
ReStructuredText
2797 lines
62 KiB
ReStructuredText
|
====================
|
|||
|
Stratus User's Guide
|
|||
|
====================
|
|||
|
Sophie Belloeil
|
|||
|
|
|||
|
|
|||
|
Introduction
|
|||
|
============
|
|||
|
|
|||
|
Stratus
|
|||
|
-------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Stratus – Procedural design language based upon *Python*
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
*Stratus* is a set of *Python* methods/functions dedicated to
|
|||
|
procedural generation purposes. From a user point of view, *Stratus* is
|
|||
|
a circuit’s description language that allows *Python* programming flow
|
|||
|
control, variable use, and specialized functions in order to handle vlsi
|
|||
|
objects.
|
|||
|
|
|||
|
Based upon the *Hurricane* data structures, the *Stratus* language gives
|
|||
|
the user the ability to describe netlist and layout views.
|
|||
|
|
|||
|
Configuration
|
|||
|
~~~~~~~~~~~~~
|
|||
|
|
|||
|
A configuration file can be used to direct the generation process of
|
|||
|
Stratus. With this file, the user can choose the output format (vst,
|
|||
|
vhdl...), the simulator (asimut, ghdl...), the standard cell library...
|
|||
|
This configuration file named ``.st_config.py`` must be placed either in
|
|||
|
the HOME directory or in the current directory. This file contains a set
|
|||
|
of variables used in the process generation of Stratus, as for example :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
format = 'vhdl'
|
|||
|
simulator = 'ghdl'
|
|||
|
|
|||
|
The default configuration of Stratus uses the Alliance CAD system, ie
|
|||
|
``'vst'`` as ``format`` and ``'asimut'`` as ``simulator``.
|
|||
|
|
|||
|
Description of a cell
|
|||
|
~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
A cell is a hierachical structural description of a circuit in terms
|
|||
|
of ports (I/Os), signals (nets) and instances.
|
|||
|
|
|||
|
The description of a cell is done by creating a new class, derivating
|
|||
|
for class ``Model``, with different methods :
|
|||
|
|
|||
|
- Method ``Interface`` : Description of the external ports of the cell
|
|||
|
:
|
|||
|
|
|||
|
- SignalIn, SignalOut, ...
|
|||
|
|
|||
|
- Method ``Netlist`` : Description of the netlist of the cell :
|
|||
|
|
|||
|
- Inst, Signal
|
|||
|
|
|||
|
- Method ``Layout`` : Description of the layout of the cell :
|
|||
|
|
|||
|
- Place, PlaceTop, PlaceBottom, PlaceRight, PlaceLeft ...
|
|||
|
|
|||
|
- Method ``Stimuli`` : Description of the simulation stimuli of the
|
|||
|
cell :
|
|||
|
|
|||
|
- affect, addd ...
|
|||
|
|
|||
|
Creation of the cell
|
|||
|
~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
After the description of a cell as a sub-class of ``Model``, the cell
|
|||
|
has to be instantiated. The different methods described before have to
|
|||
|
be called.
|
|||
|
|
|||
|
Then different methods are provided :
|
|||
|
|
|||
|
- Method ``View`` : Opens/Refreshes the editor in order to see the
|
|||
|
created layout
|
|||
|
|
|||
|
- Method ``Save`` : Saves the created cell in the desired format thanks
|
|||
|
to the configuration file
|
|||
|
|
|||
|
- no argument : creation of a netlist file
|
|||
|
|
|||
|
- PHYSICAL : creation of a netlist file AND a layout file
|
|||
|
|
|||
|
- STRATUS : creation of a python/stratus file
|
|||
|
|
|||
|
- FileName : optionnal argument when using Save(STRATUS) in order
|
|||
|
to choose the name of the file to be generated
|
|||
|
|
|||
|
- Be careful : if one wants to create a stratus file AND a
|
|||
|
netlist, always use Save(STRATUS) before Save() !
|
|||
|
|
|||
|
- Method ``Testbench`` : Creates the testbench of the cell using the
|
|||
|
``Stimuli`` method to compute the stimuli. The output format depends
|
|||
|
of the ``format`` variable given in the configuration file
|
|||
|
|
|||
|
- Method ``Simul`` : Runs the simulation using the simulator named in
|
|||
|
the configuration file
|
|||
|
|
|||
|
Syntax
|
|||
|
~~~~~~
|
|||
|
|
|||
|
A *Stratus* file must have a .py extension and must begin as follow :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
#!/usr/bin/env python
|
|||
|
|
|||
|
from stratus import *
|
|||
|
|
|||
|
The description of a cell as a sub-class of ``Model`` is done as follow
|
|||
|
:
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class myClass ( Model ) :
|
|||
|
...
|
|||
|
|
|||
|
The creation of the cell is done by instantiating the previous class as
|
|||
|
follow :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
exemple = myClass ( name, param )
|
|||
|
|
|||
|
After the different methods can be called as follow :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
exemple.Interface()
|
|||
|
exemple.Netlist()
|
|||
|
exemple.Save()
|
|||
|
...
|
|||
|
|
|||
|
In order to execute a *Stratus* file (named ``file`` for example), one
|
|||
|
has two choices :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
python file.py
|
|||
|
|
|||
|
Or :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
chmod u+x file.py
|
|||
|
./file.py
|
|||
|
|
|||
|
The names used in *Stratus*, as arguments to *Stratus* functions,
|
|||
|
should be alphanumerical, including the underscore. The arguments of
|
|||
|
*Stratus* are case sensitive, so VDD is not equivalent to vdd.
|
|||
|
|
|||
|
| Vectorized connectors or signal can be used using the [n:m] construct.
|
|||
|
|
|||
|
Syntax highlighting
|
|||
|
~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
When using vi, it’s possible to have the right syntax highlighting :
|
|||
|
|
|||
|
- Commands to do when you want to change once the coloration of your
|
|||
|
file :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
:syntax off
|
|||
|
:source /asim/coriolis/share/etc/stratus.vim
|
|||
|
|
|||
|
- Modification of your .vimrc in order to have the syntax highlighting
|
|||
|
each time you open a file :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
syntax off
|
|||
|
autocmd BufRead,BufNewfile *.py so /asim/coriolis/share/etc/stratus.vim
|
|||
|
syntax on
|
|||
|
|
|||
|
Example
|
|||
|
-------
|
|||
|
|
|||
|
The addaccu circuit
|
|||
|
~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
|add1|
|
|||
|
|
|||
|
The data-path
|
|||
|
~~~~~~~~~~~~~
|
|||
|
|
|||
|
|add2|
|
|||
|
|
|||
|
Description of the circuit with *Stratus* : file addaccu.py
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
|addaccu|
|
|||
|
|
|||
|
Creation of the circuit : file test.py
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
|test|
|
|||
|
|
|||
|
How to execute the file
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
python test.py -n 4
|
|||
|
|
|||
|
or :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
chmod u+x test.py
|
|||
|
./test -n 4
|
|||
|
|
|||
|
The editor
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
The method ``View`` permits to open an editor in which one can see the
|
|||
|
cell being created as shown in the picture below.
|
|||
|
|
|||
|
|editor|
|
|||
|
|
|||
|
Function Param
|
|||
|
~~~~~~~~~~~~~~
|
|||
|
|
|||
|
This function allows the user to give parameters when creating a cell.
|
|||
|
When one wants to give values to two parameters, one can type on the
|
|||
|
shell :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
python test.py -n 4 -w 8
|
|||
|
|
|||
|
The file ``test.py`` has then to contain :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
nbit, nword = Param ( "n", "w" )
|
|||
|
|
|||
|
The letters typed on the shell must be the ones given as parameters of
|
|||
|
function ``Param``.
|
|||
|
|
|||
|
How to instanciate your generator in another generator
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
One can create a generator and instantiate it in another generator.
|
|||
|
To do that, the model name of the generator must have the form :
|
|||
|
“file\_name.class\_name”.
|
|||
|
Note that if the two generators are not in the same directory, the
|
|||
|
directory of the generator to be instantiated has to be added in the
|
|||
|
CRL\_CATA\_LIB environment variable.
|
|||
|
|
|||
|
For example, in order to instanciate the addaccu created above in a cell
|
|||
|
:
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
n = 4
|
|||
|
Generate ( "addaccu.addaccu", "my_addaccu_%dbits" % n
|
|||
|
, param = { 'nbit' : n } )
|
|||
|
|
|||
|
Inst ( "my_addaccu_%dbits" % n
|
|||
|
, map = { 'a' : self.netA
|
|||
|
, 'b' : self.netB
|
|||
|
, 'c' : self.netC
|
|||
|
, 'v' : self.netV
|
|||
|
, 'cmd' : self.netCmd
|
|||
|
, 'cout' : self.netCout
|
|||
|
, 's' : self.netS
|
|||
|
, 'vdd' : self.vdd
|
|||
|
, 'vss' : self.vss
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
Description of a netlist
|
|||
|
========================
|
|||
|
|
|||
|
Nets
|
|||
|
----
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
SignalIn, SignalOut ... – Creation of nets
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
netA = SignalIn ( "a", 4 )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
How to create and use nets.
|
|||
|
|
|||
|
Nets
|
|||
|
~~~~
|
|||
|
|
|||
|
Differents kind of nets are listed below :
|
|||
|
|
|||
|
- ``SignalIn`` : Creation of an input port
|
|||
|
|
|||
|
- ``SignalOut`` : Creation of an output port
|
|||
|
|
|||
|
- ``SignalInOut`` : Creation of an inout port
|
|||
|
|
|||
|
- ``SignalUnknown`` : Creation of an input/output port which direction
|
|||
|
is not defined
|
|||
|
|
|||
|
- ``TriState`` : Creation of a tristate port
|
|||
|
|
|||
|
- ``CkIn`` : Creation of a clock port
|
|||
|
|
|||
|
- ``VddIn`` : Creation of the vdd alimentation
|
|||
|
|
|||
|
- ``VssIn`` : Creation of the vss alimentation
|
|||
|
|
|||
|
- ``Signal`` : Creation of an internal net
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
All kind of constructors have the same parameters :
|
|||
|
|
|||
|
- ``name`` : the name of the net (mandatory argument)
|
|||
|
|
|||
|
- ``arity`` : the arity of the net (mandatory argument)
|
|||
|
|
|||
|
- ``indice`` : for bit vectors only : the LSB bit (optional argument :
|
|||
|
set to 0 by default)
|
|||
|
|
|||
|
Only ``CkIn``, ``VddIn`` and ``VssIn`` do not have the same parameters :
|
|||
|
there is only the ``name`` parameter (they are 1 bit nets).
|
|||
|
|
|||
|
Functions and methods
|
|||
|
~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
Some functions/methods are provided in order to handle nets :
|
|||
|
|
|||
|
- function ``Cat`` : Concatenation of nets, beginning with the MSB
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Inst ( 'DpgenInv'
|
|||
|
, map = { 'i0' : Cat ( A, B )
|
|||
|
, 'nq' : S
|
|||
|
, 'vdd' : vdd
|
|||
|
, 'vss' : vss
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
Or :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
tab = []
|
|||
|
tab.append ( A )
|
|||
|
tab.append ( B )
|
|||
|
|
|||
|
Inst ( 'DpgenInv'
|
|||
|
, map = { 'i0' : Cat ( tab )
|
|||
|
, 'nq' : S
|
|||
|
, 'vdd' : vdd
|
|||
|
, 'vss' : vss
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
If A and B are 2 bits nets, the net ``myNet`` will be such as :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
myNet[3] = A[1]
|
|||
|
myNet[2] = A[0]
|
|||
|
myNet[1] = B[1]
|
|||
|
myNet[0] = B[0]
|
|||
|
|
|||
|
- function ``Extend`` : Creation of a net which is an extension of the
|
|||
|
net which it is applied to
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
temp = Signal ( "temp", 5 )
|
|||
|
tempExt = Signal ( "temp_ext", 8 )
|
|||
|
|
|||
|
tempExt <= temp.Extand ( 8, 'one' )
|
|||
|
|
|||
|
- method ``Alias`` : Creation of an alias name for a net
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
cin.Alias ( c_temp[0] )
|
|||
|
cout.Alias ( c_temp[4] )
|
|||
|
for i in range ( 4 ) :
|
|||
|
Inst ( "Fulladder"
|
|||
|
, map = { 'a' : a[i]
|
|||
|
, 'b' : b[i]
|
|||
|
, 'cin' : c_temp[i]
|
|||
|
, 'sout' : sout[i]
|
|||
|
, 'cout' : c_temp[i+1]
|
|||
|
, 'vdd' : vdd
|
|||
|
, 'vss' : vss
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- | ``Error in SignalIn :``
|
|||
|
| ``the lenght of the net must be a positive value.``
|
|||
|
| One can not create a net with a negative lenght.
|
|||
|
|
|||
|
|
|||
|
Instances
|
|||
|
---------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Inst – Creation of instances
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Inst ( model
|
|||
|
, name
|
|||
|
, map = connectmap
|
|||
|
)
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Instantiation of an instance. The type of the instance is given by the
|
|||
|
``model`` parameter. The connexions are made thanks to the
|
|||
|
``connectmap`` parameters.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``Model`` : Name of the mastercell of the instance to create
|
|||
|
(mandatory argument)
|
|||
|
|
|||
|
- ``name`` : Name of the instance (optional)
|
|||
|
When this argument is not defined, the instance has a name created
|
|||
|
by default. This argument is usefull when one wants to create a
|
|||
|
layout as well. Indeed, the placement of the instances is much easier
|
|||
|
when the conceptor has chosen himself the name f the
|
|||
|
instances.</para>
|
|||
|
|
|||
|
- ``connectmap`` : Connexions in order to make the netlist
|
|||
|
|
|||
|
``param`` and ``map`` are dictionnaries as shown in the example below.
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Inst ( 'a2_x2'
|
|||
|
, map = { 'i0' : in0
|
|||
|
, 'i1' : in1
|
|||
|
, 'q' : out
|
|||
|
, 'vdd' : vdd
|
|||
|
, 'vss' : vss
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
You can see a concrete example at :
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``Error in Inst : the model Model does not exist.``
|
|||
|
``Check CRL_CATA_LIB.``
|
|||
|
Either one has made a mistake in the name of the model, either the
|
|||
|
environment variable is not correct.
|
|||
|
|
|||
|
- ``Error in Inst : port does not exist in model Model.``
|
|||
|
One port in map is not correct.
|
|||
|
|
|||
|
- ``Error in Inst : one input net is not dimensionned.``
|
|||
|
The size of the output nets is automatically calculated bus the
|
|||
|
input nets must be dimensionned before being connected.
|
|||
|
|
|||
|
|
|||
|
Generators
|
|||
|
----------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Generate – Interface with the generators
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Generate ( model, modelname, param = dict )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
The ``Generate`` function call is the generic interface to all
|
|||
|
generators.
|
|||
|
|
|||
|
Arguments
|
|||
|
~~~~~~~~~
|
|||
|
|
|||
|
- ``model`` : Specifies which generator is to be invoked
|
|||
|
|
|||
|
- If the generator belongs to the Dpgen library provided by Stratus,
|
|||
|
the model name of the generator is simply the name of the class of
|
|||
|
the generator.
|
|||
|
|
|||
|
- If the generator is created by the user, the model name of the
|
|||
|
generator must have the form : “file\_name.class\_name”. (Note
|
|||
|
that if the the generator is not in the working directory, the
|
|||
|
directory of the generator to be instantiated has to be added in
|
|||
|
the CRL\_CATA\_LIB environment variable)
|
|||
|
|
|||
|
- ``modelname`` : Specifies the name of the model to be generated
|
|||
|
|
|||
|
- ``dict`` : Specifies the parameters of the generator
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
Every generator has it’s own parameters. They must be described in the
|
|||
|
map ``dict``.
|
|||
|
Every generator provides a netlist view. Two other views can be
|
|||
|
generated, if they are provided by the generator. Two parameters have to
|
|||
|
be given, in order to choose those views :
|
|||
|
|
|||
|
- ’physical’ : True/False, generation of the physical view (optionnal,
|
|||
|
False by default)
|
|||
|
|
|||
|
- ’behavioral’ : True/False, generation of the behavioral view
|
|||
|
(optionnal, False by default)
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Generate : the model must be described in a string.``
|
|||
|
|
|||
|
|
|||
|
Description of a layout
|
|||
|
=======================
|
|||
|
|
|||
|
Place
|
|||
|
-----
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Place – Places an instance
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Place ( ins, sym, point )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of an instance.
|
|||
|
The instance has to be instantiated in the method ``Netlist``, in
|
|||
|
order to use the ``Place`` function.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``ins`` : Instance to place.
|
|||
|
|
|||
|
- ``sym`` : Geometrical operation to be performed on the instance
|
|||
|
before beeing placed.
|
|||
|
The ``sym`` argument can take eight legal values :
|
|||
|
|
|||
|
- ``NOSYM`` : no geometrical operation is performed
|
|||
|
|
|||
|
- ``SYM_Y`` : Y becomes -Y, that means toward X axe symetry
|
|||
|
|
|||
|
- ``SYM_X`` : X becomes -X, that means toward Y axe symetry
|
|||
|
|
|||
|
- ``SYMXY`` : X becomes -X, Y becomes -Y
|
|||
|
|
|||
|
- ``ROT_P`` : a positive 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``ROT_M`` : a negative 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``SY_RP`` : Y becomes -Y, and then a positive 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``SY_RM`` : Y becomes -Y, and then a negative 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``point`` : coordinates of the lower left corner of the abutment box
|
|||
|
of the instance in the current figure.
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Place ( myInst, NOSYM, XY ( 0, 0 ) )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- | ``[Stratus ERROR] Placement : the instance doesn't exist.``
|
|||
|
| The instance must be instanciated in order to be placed.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the first argument is not an instance.``
|
|||
|
|
|||
|
- | ``[Stratus ERROR] Placement : the instance is already placed.``
|
|||
|
| One can not place an instance twice
|
|||
|
|
|||
|
- | ``[Stratus ERROR] Place : wrong argument for placement type.``
|
|||
|
| The symetry given as argument is not correct.
|
|||
|
|
|||
|
- | ``[Stratus ERROR] Place : wrong argument for placement,``
|
|||
|
| `` the coordinates must be put in a XY object.``
|
|||
|
| The coordinates are not descrobed the bood way.
|
|||
|
|
|||
|
|
|||
|
PlaceTop
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceTop – Places an instance at the top of the “reference instance”
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceTop ( ins, sym, offsetX, offsetY )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of an instance.
|
|||
|
The instance has to be instantiated in the method ``Netlist`` in order
|
|||
|
to use the ``PlaceTop`` function.
|
|||
|
|
|||
|
The bottom left corner of the abutment box of the instance is placed,
|
|||
|
after beeing symetrized and/or rotated, toward the top left corner of
|
|||
|
the abutment box of the “reference instance”. The newly placed instance
|
|||
|
becomes the “reference instance”.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``ins`` : Instance to place.
|
|||
|
|
|||
|
- ``sym`` : Geometrical operation to be performed on the instance
|
|||
|
before beeing placed.
|
|||
|
The ``sym`` argument can take eight legal values :
|
|||
|
|
|||
|
- ``NOSYM`` : no geometrical operation is performed
|
|||
|
|
|||
|
- ``SYM_Y`` : Y becomes -Y, that means toward X axe symetry
|
|||
|
|
|||
|
- ``SYM_X`` : X becomes -X, that means toward Y axe symetry
|
|||
|
|
|||
|
- ``SYMXY`` : X becomes -X, Y becomes -Y
|
|||
|
|
|||
|
- ``ROT_P`` : a positive 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``ROT_M`` : a negative 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``SY_RP`` : Y becomes -Y, and then a positive 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``SY_RM`` : Y becomes -Y, and then a negative 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``offsetX`` (optionnal) : An offset is put horizontally. The value
|
|||
|
given as argument must be a multiple of PITCH
|
|||
|
|
|||
|
- ``offsetY`` (optionnal) : An offset is put vertically. The value
|
|||
|
given as argument must be a multiple of SLICE
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Place ( myInst1, NOSYM, 0, 0 )
|
|||
|
PlaceTop ( myInst2, SYM_Y )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance doesn't exist.``
|
|||
|
The instance must be instanciated in order to be placed.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the first argument is not an instance.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance is already placed.``
|
|||
|
One can not place an instance twice
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceTop : no previous instance.``
|
|||
|
One can use ``PlaceTop`` only if a reference instance exist. Use a
|
|||
|
``Place`` call before.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceTop : wrong argument for placement type.``
|
|||
|
The symetry given as argument is not correct.
|
|||
|
|
|||
|
|
|||
|
PlaceBottom
|
|||
|
-----------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceBottom – Places an instance below the “reference instance”
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceBottom ( ins, sym, offsetX, offsetY )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of an instance.
|
|||
|
The instance has to be instantiated in the method ``Netlist`` in order
|
|||
|
to use the ``PlaceTop`` function.
|
|||
|
|
|||
|
The top left corner of the abutment box of the instance is placed, after
|
|||
|
beeing symetrized and/or rotated, toward the bottom left corner of the
|
|||
|
abutment box of the “reference instance”. The newly placed instance
|
|||
|
becomes the “reference instance”.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``ins`` : Instance to place.
|
|||
|
|
|||
|
- ``sym`` : Geometrical operation to be performed on the instance
|
|||
|
before beeing placed.
|
|||
|
The ``sym`` argument can take eight legal values :
|
|||
|
|
|||
|
- ``NOSYM`` : no geometrical operation is performed
|
|||
|
|
|||
|
- ``SYM_Y`` : Y becomes -Y, that means toward X axe symetry
|
|||
|
|
|||
|
- ``SYM_X`` : X becomes -X, that means toward Y axe symetry
|
|||
|
|
|||
|
- ``SYMXY`` : X becomes -X, Y becomes -Y
|
|||
|
|
|||
|
- ``ROT_P`` : a positive 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``ROT_M`` : a negative 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``SY_RP`` : Y becomes -Y, and then a positive 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``SY_RM`` : Y becomes -Y, and then a negative 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``offsetX`` (optionnal) : An offset is put horizontally. The value
|
|||
|
given as argument must be a multiple of PITCH
|
|||
|
|
|||
|
- ``offsetY`` (optionnal) : An offset is put vertically. The value
|
|||
|
given as argument must be a multiple of SLICE
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Place ( myInst1, NOSYM, 0, 0 )
|
|||
|
PlaceBottom ( myInst2, SYM_Y )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance doesn't exist.``
|
|||
|
The instance must be instanciated in order to be placed.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the first argument is not an instance.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance is already placed.``
|
|||
|
One can not place an instance twice
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceBottom : no previous instance.``
|
|||
|
One can use ``PlaceBottom`` only if a reference instance exist. Use
|
|||
|
a ``Place`` call before.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceBottom : wrong argument for placement type.``
|
|||
|
The symetry given as argument is not correct.
|
|||
|
|
|||
|
|
|||
|
PlaceRight
|
|||
|
----------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceRight – Places an instance at the right of the “reference instance”
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceRight ( ins, sym, offsetX, offsetY )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of an instance.
|
|||
|
The instance has to be instantiated in the method ``Netlist`` in order
|
|||
|
to use the ``PlaceTop`` function.
|
|||
|
|
|||
|
The bottom left corner of the abutment box of the instance is placed,
|
|||
|
after beeing symetrized and/or rotated, toward the bottom right corner
|
|||
|
of the abutment box of the “reference instance”. The newly placed
|
|||
|
instance becomes the “reference instance”.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``ins`` : Instance to place.
|
|||
|
|
|||
|
- ``sym`` : Geometrical operation to be performed on the instance
|
|||
|
before beeing placed.
|
|||
|
The ``sym`` argument can take eight legal values :
|
|||
|
|
|||
|
- ``NOSYM`` : no geometrical operation is performed
|
|||
|
|
|||
|
- ``SYM_Y`` : Y becomes -Y, that means toward X axe symetry
|
|||
|
|
|||
|
- ``SYM_X`` : X becomes -X, that means toward Y axe symetry
|
|||
|
|
|||
|
- ``SYMXY`` : X becomes -X, Y becomes -Y
|
|||
|
|
|||
|
- ``ROT_P`` : a positive 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``ROT_M`` : a negative 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``SY_RP`` : Y becomes -Y, and then a positive 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``SY_RM`` : Y becomes -Y, and then a negative 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``offsetX`` (optionnal) : An offset is put horizontally. The value
|
|||
|
given as argument must be a multiple of PITCH
|
|||
|
|
|||
|
- ``offsetY`` (optionnal) : An offset is put vertically. The value
|
|||
|
given as argument must be a multiple of SLICE
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Place ( myInst1, NOSYM, 0, 0 )
|
|||
|
PlaceRight ( myInst2, NOSYM )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance doesn't exist.``
|
|||
|
The instance must be instanciated in order to be placed.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the first argument is not an instance.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance is already placed.``
|
|||
|
One can not place an instance twice
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceRight : no previous instance.``
|
|||
|
One can use ``PlaceRight`` only if a reference instance exist. Use
|
|||
|
a ``Place`` call before.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceRight : wrong argument for placement type.``
|
|||
|
The symetry given as argument is not correct.
|
|||
|
|
|||
|
|
|||
|
PlaceLeft
|
|||
|
---------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceLeft – Places an instance at the left of the “reference instance”
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceLeft ( ins, sym, offsetX, offsetY )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of an instance.
|
|||
|
The instance has to be instantiated in the method ``Netlist`` in order
|
|||
|
to use the ``PlaceTop`` function.
|
|||
|
|
|||
|
The bottom right corner of the abutment box of the instance is placed,
|
|||
|
after beeing symetrized and/or rotated, toward the bottom left corner of
|
|||
|
the abutment box of the “reference instance”. The newly placed instance
|
|||
|
becomes the “reference instance”.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``ins`` : Instance to place.
|
|||
|
|
|||
|
- ``sym`` : Geometrical operation to be performed on the instance
|
|||
|
before beeing placed.
|
|||
|
The ``sym`` argument can take eight legal values :
|
|||
|
|
|||
|
- ``NOSYM`` : no geometrical operation is performed
|
|||
|
|
|||
|
- ``SYM_Y`` : Y becomes -Y, that means toward X axe symetry
|
|||
|
|
|||
|
- ``SYM_X`` : X becomes -X, that means toward Y axe symetry
|
|||
|
|
|||
|
- ``SYMXY`` : X becomes -X, Y becomes -Y
|
|||
|
|
|||
|
- ``ROT_P`` : a positive 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``ROT_M`` : a negative 90 degrees rotation takes place
|
|||
|
|
|||
|
- ``SY_RP`` : Y becomes -Y, and then a positive 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``SY_RM`` : Y becomes -Y, and then a negative 90 degrees rotation
|
|||
|
takes place
|
|||
|
|
|||
|
- ``offsetX`` (optionnal) : An offset is put horizontally. The value
|
|||
|
given as argument must be a multiple of PITCH
|
|||
|
|
|||
|
- ``offsetY`` (optionnal) : An offset is put vertically. The value
|
|||
|
given as argument must be a multiple of SLICE
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Place ( myInst1, NOSYM, 0, 0 )
|
|||
|
PlaceLeft ( myInst2, NOSYM )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance doesn't exist.``
|
|||
|
The instance must be instanciated in order to be placed.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the first argument is not an instance.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement : the instance is already placed.``
|
|||
|
One can not place an instance twice
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceLeft : no previous instance.``
|
|||
|
One can use ``PlaceLeft`` only if a reference instance exist. Use a
|
|||
|
``Place`` call before.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceLeft : wrong argument for placement type.``
|
|||
|
The symetry given as argument is not correct.
|
|||
|
|
|||
|
|
|||
|
SetRefIns
|
|||
|
---------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
SetRefIns – Defines the new “reference instance” for placement
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
SetRefIns ( ins )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function defines the new “reference instance”, used as starting
|
|||
|
point in the relative placement functions.
|
|||
|
It’s regarding the abutmentbox of the instance ``ins`` that the next
|
|||
|
instance is going to be placed, if using the appropriate functions.
|
|||
|
|
|||
|
Note that the more recently placed instance becomes automaticaly the
|
|||
|
“reference instance”, if SetRefIns isn’t called.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``ins`` : defines the new “reference instance”
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Place ( myInst1, NOSYM, 0, 0 )
|
|||
|
PlaceRight ( myInst2, NOSYM )
|
|||
|
|
|||
|
SetRefIns ( myInst1 )
|
|||
|
PlaceTop ( myInst3, SYM_Y )
|
|||
|
|
|||
|
``myInst3`` is on top of ``myInst1`` instead of ``myInst2``.
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] SetRefIns : the instance doesn't exist.``
|
|||
|
If the instance has not been instanciated, it is impossible do to
|
|||
|
any placement from it.
|
|||
|
|
|||
|
- ``[Stratus ERROR] SetRefIns : the instance ...is not placed.``
|
|||
|
If the instance has not been placed, it is impossible do to any
|
|||
|
placement from it.
|
|||
|
|
|||
|
|
|||
|
DefAb
|
|||
|
-----
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
DefAb – Creates the abutment box of the current cell
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
DefAb ( point1, point2 )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function creates the abutment box of the current cell.
|
|||
|
|
|||
|
Note that one does not have to call this function before saving in order
|
|||
|
to create the abutment box. The abutment box is created nevertheless
|
|||
|
(given to placed instances). This function is usefull if one wants to
|
|||
|
create an abutment before placing the instances.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``point1`` : coordinates of the bottom left corner of the created
|
|||
|
abutment box.
|
|||
|
|
|||
|
- ``point2`` : coordinates of the top right corner of the created
|
|||
|
abutment box.
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
DefAb ( XY(0, 0), XY(500, 100) )
|
|||
|
|
|||
|
Place ( self.inst, NOSYM, XY(0, 0) )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] DefAb : an abutment box already exists.``
|
|||
|
`` Maybe you should use ResizeAb function.``
|
|||
|
One has called DefAb but the current cell already has an abutment
|
|||
|
box.
|
|||
|
In order to modify the current abutment box, the function to call
|
|||
|
is ResizeAb.
|
|||
|
|
|||
|
- ``[Stratus ERROR] DefAb : wrong argument,``
|
|||
|
`` the coordinates must be put in a XY object.``
|
|||
|
The type of one of the arguments is not correct. Coordinates must
|
|||
|
be put in a ``XY`` object.
|
|||
|
|
|||
|
- ``[Stratus ERROR] DefAb :``
|
|||
|
``Coordinates of an abutment Box in y must be multiple of the slice.``
|
|||
|
``Coordinates of an abutment Box in x must be multiple of the pitch.``
|
|||
|
One has called DefAb with non authorized values.
|
|||
|
|
|||
|
|
|||
|
ResizeAb
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
ResizeAb – Modifies the abutment box of the current cell
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
ResizeAb ( dx1, dy1, dx2, dy2 )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function modifies the abutment box of the current cell.
|
|||
|
The coordinates of the abutment box are the coordinates of the envelop
|
|||
|
of the abutment boxes of each instance plus the delta values given as
|
|||
|
argument.
|
|||
|
|
|||
|
Note that one can not call this function in order to create the abutment
|
|||
|
box. This fonction only modifies the already created abutment box.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``(dx1, dy1)`` : Values to be substracted to the lower left corner of
|
|||
|
the previous abutment box.
|
|||
|
|
|||
|
- ``(dx2, dy2)`` : Values to be added to the upper right corner of the
|
|||
|
previous abutment box.
|
|||
|
|
|||
|
The Values are used as follow :
|
|||
|
|
|||
|
|resize|
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
% Expansion of the abutment box at the top and the bottom
|
|||
|
ResizeAb ( 0, 100, 0, 100 )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- `` [Stratus ERROR] ResizeAb :``
|
|||
|
``Coordinates of an abutment Box in y must be multiple of the slice.``
|
|||
|
``Coordinates of an abutment Box in x must be multiple of the pitch.``
|
|||
|
One has called ResizeAb with non authorized values
|
|||
|
|
|||
|
- `` [Stratus ERROR] ResizeAb :``
|
|||
|
``one of the values of dx1 or dx2 (dy1 or dy2) is incompatible with``
|
|||
|
``the size of the abutment box.``
|
|||
|
``Coordinates of an abutment Box in x must be multiple of the pitch.``
|
|||
|
One has called ResizeAb with a value which deteriorates the
|
|||
|
abtument box
|
|||
|
|
|||
|
|
|||
|
Patterns generation extension
|
|||
|
=============================
|
|||
|
|
|||
|
Description of the stimuli
|
|||
|
--------------------------
|
|||
|
|
|||
|
The stimuli used for the simulation are described in a ``Stimuli``
|
|||
|
method. This method is a Python function generator that is automatically
|
|||
|
called by the ``Testbench`` method to generate all the stimuli. As a
|
|||
|
Python function generator, the ``yield`` instruction have to be used at
|
|||
|
the end of each stimuli computation.
|
|||
|
|
|||
|
Affect value to signals
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
The method ``affect`` permits to affect a value to a given signal as
|
|||
|
follow
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
self._stim.affect(self.Ck,0)
|
|||
|
|
|||
|
Add stimuli
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
The method ``add`` permits to finish a step of simulation by add all the
|
|||
|
values to the current stimuli
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
self._stim.add()
|
|||
|
|
|||
|
Place and Route
|
|||
|
===============
|
|||
|
|
|||
|
PlaceSegment
|
|||
|
------------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceSegment – Places a segment
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceSegment ( net, layer, point1, point2, width )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of a segment.
|
|||
|
The segment is created between ``point1`` and ``point2`` on the layer
|
|||
|
``layer`` and with width ``width``. It belongs to the net ``net``.
|
|||
|
Note that the segment must be horizontal or vertival.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``net`` : Net which the segment belongs to
|
|||
|
|
|||
|
- ``layer`` : Layer of the segment.
|
|||
|
The ``layer`` argument is a string wich can take different values,
|
|||
|
thanks to the technology (file described in HUR\_TECHNO\_NAME)
|
|||
|
|
|||
|
- NWELL, PWELL, ptie, ntie, pdif, ndif, ntrans, ptrans, poly, ALU1,
|
|||
|
ALU2, ALU3, ALU4, ALU5, ALU6, VIA1, VIA2, VIA3, VIA4, VIA5, TEXT,
|
|||
|
UNDEF, SPL1, TALU1, TALU2, TALU3, TALU4, TALU5, TALU6, POLY, NTIE,
|
|||
|
PTIE, NDIF, PDIF, PTRANS, NTRANS, CALU1, CALU2, CALU3, CALU4,
|
|||
|
CALU5, CALU6, CONT\_POLY, CONT\_DIF\_N, CONT\_DIF\_P,
|
|||
|
CONT\_BODY\_N, CONT\_BODY\_P, via12, via23, via34, via45, via56,
|
|||
|
via24, via25, via26, via35, via36, via46, CONT\_TURN1,
|
|||
|
CONT\_TURN2, CONT\_TURN3, CONT\_TURN4, CONT\_TURN5, CONT\_TURN6
|
|||
|
|
|||
|
- ``point1``, ``point2`` : The segment is created between those two
|
|||
|
points
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceSegment ( myNet, "ALU3", XY (10, 0), XY (10, 100), 2 )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceSegment : Argument layer must be a string.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceSegment : Wrong argument,``
|
|||
|
``the coordinates of the segment must be put in XY objects.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceSegment : Segments are vertical or horizontal.``
|
|||
|
The two references given as argument do not describe a vertical or
|
|||
|
horizontal segment. Wether coordinate x or y of the references must
|
|||
|
be identical.
|
|||
|
|
|||
|
]*CopyUpSegment*CopyUpSegmentseccopy
|
|||
|
|
|||
|
PlaceContact
|
|||
|
------------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceContact – Places a contact
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceContact ( net, layer, point, width, height )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of a contact.
|
|||
|
The contact is located at the coodinates of ``point``, on the layer
|
|||
|
``layer`` and has a size of 1 per 1. It belongs to the net ``net``.
|
|||
|
Note that the segment must be horizontal or vertival.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``net`` : Net which the contact belongs to
|
|||
|
|
|||
|
- ``layer`` : Layer of the segment.
|
|||
|
The ``layer`` argument is a string wich can take different values,
|
|||
|
thanks to the technology (file described in HUR\_TECHNO\_NAME)
|
|||
|
|
|||
|
- NWELL, PWELL, ptie, ntie, pdif, ndif, ntrans, ptrans, poly, ALU1,
|
|||
|
ALU2, ALU3, ALU4, ALU5, ALU6, VIA1, VIA2, VIA3, VIA4, VIA5, TEXT,
|
|||
|
UNDEF, SPL1, TALU1, TALU2, TALU3, TALU4, TALU5, TALU6, POLY, NTIE,
|
|||
|
PTIE, NDIF, PDIF, PTRANS, NTRANS, CALU1, CALU2, CALU3, CALU4,
|
|||
|
CALU5, CALU6, CONT\_POLY, CONT\_DIF\_N, CONT\_DIF\_P,
|
|||
|
CONT\_BODY\_N, CONT\_BODY\_P, via12, via23, via34, via45, via56,
|
|||
|
via24, via25, via26, via35, via36, via46, CONT\_TURN1,
|
|||
|
CONT\_TURN2, CONT\_TURN3, CONT\_TURN4, CONT\_TURN5, CONT\_TURN6
|
|||
|
|
|||
|
- ``point`` : Coodinates of the contact
|
|||
|
|
|||
|
- ``width`` : Width of the contact
|
|||
|
|
|||
|
- ``height`` : Height of the contact
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceContact ( myNet, "ALU2", XY (10, 0), 2, 2 )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceContact : Argument layer must be a string.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceContact : Wrong argument,``
|
|||
|
``the coordinates of the contact must be put in a XY object.``
|
|||
|
|
|||
|
|
|||
|
PlacePin
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlacePin – Places a pin
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlacePin ( net, layer, direction, point, width, height )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of a pin.
|
|||
|
The pin is located at the coodinates of ``point``, on the layer
|
|||
|
``layer``, has a a direction of ``direction`` and size of 1 per 1. It
|
|||
|
belongs to the net ``net``.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``net`` : Net which the pin belongs to
|
|||
|
|
|||
|
- ``layer`` : Layer of the segment.
|
|||
|
The ``layer`` argument is a string wich can take different values,
|
|||
|
thanks to the technology (file described in HUR\_TECHNO\_NAME)
|
|||
|
|
|||
|
- NWELL, PWELL, ptie, ntie, pdif, ndif, ntrans, ptrans, poly, ALU1,
|
|||
|
ALU2, ALU3, ALU4, ALU5, ALU6, VIA1, VIA2, VIA3, VIA4, VIA5, TEXT,
|
|||
|
UNDEF, SPL1, TALU1, TALU2, TALU3, TALU4, TALU5, TALU6, POLY, NTIE,
|
|||
|
PTIE, NDIF, PDIF, PTRANS, NTRANS, CALU1, CALU2, CALU3, CALU4,
|
|||
|
CALU5, CALU6, CONT\_POLY, CONT\_DIF\_N, CONT\_DIF\_P,
|
|||
|
CONT\_BODY\_N, CONT\_BODY\_P, via12, via23, via34, via45, via56,
|
|||
|
via24, via25, via26, via35, via36, via46, CONT\_TURN1,
|
|||
|
CONT\_TURN2, CONT\_TURN3, CONT\_TURN4, CONT\_TURN5, CONT\_TURN6
|
|||
|
|
|||
|
- ``direction`` : Direction of the pin
|
|||
|
|
|||
|
- UNDEFINED, NORTH, SOUTH, EAST, WEST
|
|||
|
|
|||
|
- ``point`` : Coodinates of the pin
|
|||
|
|
|||
|
- ``width`` : Width of the pin
|
|||
|
|
|||
|
- ``height`` : Height of the pin
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlacePin ( myNet, "ALU2", NORTH, XY (10, 0), 2, 2 )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlacePin : Argument layer must be a string.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlacePin : Illegal pin access direction.``
|
|||
|
``The values are : UNDEFINED, NORTH, SOUTH, EAST, WEST.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlacePin : Wrong argument,``
|
|||
|
``the coordinates of the pin must be put in a XY object.``
|
|||
|
|
|||
|
PlaceRef
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceRef – Places a reference
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceRef ( point, name )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Placement of a reference.
|
|||
|
The reference is located at the coordinates of ``point``, with name
|
|||
|
``name``.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``point`` : Coodinates of the reference
|
|||
|
|
|||
|
- ``name`` : Name of the reference
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceRef ( XY (10, 0), "myref" )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceRef : Wrong argument,``
|
|||
|
``the coordinates of the reference must be put in a XY object.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceRef : Argument layer must be a string.``
|
|||
|
|
|||
|
|
|||
|
GetRefXY
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
GetRefXY – Returns the coordinates of a reference
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
GetRefXY ( pathname, refname )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Computation of coordinates.
|
|||
|
The point returned (object XY) represents the location of the
|
|||
|
reference of name ``refname`` within the coodinates system of the top
|
|||
|
cell. The reference ``refname`` is instanciated in an instance found
|
|||
|
thanks to ``pathname`` which represents an ordered sequence of instances
|
|||
|
through the hierarchy.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``pathname`` : The path in order to obtain, from the top cell, the
|
|||
|
instance the reference ``refname`` belongs to
|
|||
|
|
|||
|
- ``refname`` : The name of the reference
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
The cell which is being created (the top cell), instanciates a generator
|
|||
|
with instance name “my\_dpgen\_and2”. This generator instanciates an
|
|||
|
instance called “cell\_1” which the reference “i0\_20” belongs to.
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
GetRefXY ( "my_dpgen_and2.cell_1", "i0_20" )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] GetRefXY :``
|
|||
|
``The instance's path must be put with a string.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] GetRefXY :``
|
|||
|
``The reference must be done with it's name : a string.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] GetRefXY :``
|
|||
|
``No reference found with name ... in masterCell ...``
|
|||
|
|
|||
|
CopyUpSegment
|
|||
|
-------------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
CopyUpSegment – Copies the segment of an instance in the current cell
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
CopyUpSegment ( pathname, netname, newnet )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Duplication of a segment.
|
|||
|
The segment is created with the same cordinates and layer as the
|
|||
|
segment corresponding to the net ``netname`` in the instance found
|
|||
|
thanks to ``pathname``. It belongs to the net ``newnet``.
|
|||
|
Note that if several segments correspond to the net, they are all
|
|||
|
going to be copied.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``pathname`` : The path in order to obtain, from the top cell, the
|
|||
|
instance the net ``netname`` belongs to
|
|||
|
|
|||
|
- ``netname`` : The name of the net which the segment belongs to
|
|||
|
|
|||
|
- ``net`` : The net which the top cell segment os going to belong to
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
CopuUpSegment ( "my_dpgen_and2.cell_1", "i0", myNet )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] CopyUpSegment :``
|
|||
|
``The instance's path must be put with a string.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] CopyUpSegment :``
|
|||
|
``The segment must be done with it's name : a string.``
|
|||
|
|
|||
|
- ``[Stratus ERROR] CopyUpSegment :``
|
|||
|
``No net found with name ... in masterCell ...``
|
|||
|
There is no net with name ``netname`` in the instance found thanks
|
|||
|
to the path ``pathname``.
|
|||
|
|
|||
|
- ``[Stratus ERROR] CopyUpSegment :``
|
|||
|
``No segment found with net ... in masterCell ...``
|
|||
|
The net with name ``netname`` has no segment. So the copy of
|
|||
|
segment can not be done.
|
|||
|
|
|||
|
- ``[Stratus ERROR] CopyUpSegment :``
|
|||
|
``the segment of net ... are not of type CALU.``
|
|||
|
In other words, the net is not an external net. The copy can be
|
|||
|
done only with external nets.
|
|||
|
|
|||
|
PlaceCentric
|
|||
|
------------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceCentric – Placement of an instance in the middle of an abutment box
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceCentric ( ins )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function places an instance in the middle of and abutment box.
|
|||
|
The instance has to be instantiated in the method ``Netlist`` in order
|
|||
|
to use this function.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``ins`` : Instance to place
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceCentric: the instance does not exist.``
|
|||
|
The instance must be instanciated in order to be placed.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PlaceCentric :``
|
|||
|
``the instance's size is greater than this model.``
|
|||
|
The instance must fit in the abutment box. The abutment box may not
|
|||
|
be big enough.
|
|||
|
|
|||
|
PlaceGlu
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PlaceGlue – Automatic placement of non placed instances
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PlaceGlue ( cell )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function places, thanks to the automatic placer Mistral of
|
|||
|
Coriolis, all the non placed instances of the cell.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``cell`` : the cell which the fonction is applied to
|
|||
|
|
|||
|
FillCell
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
FillCell – Automatic placement of ties.
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
FillCell ( cell )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function places automatically ties.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``cell`` : the cell which the fonction is applied to
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] FillCell : Given cell doesn't exist.``
|
|||
|
The argument is wrong. Check if one has created the cell correctly.
|
|||
|
|
|||
|
Pads
|
|||
|
----
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PadNorth, PadSouth, PadEast, PasWest – Placement of pads at the
|
|||
|
periphery of the cell
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PadNorth ( args )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
These functions place the pads given as arguments at the given side of
|
|||
|
the cell (PadNorth : up north, PadSouth : down south ...). Pads are
|
|||
|
placed from bottom to top for PadNorth and PadSouth and from left to
|
|||
|
right for PadWest and PasEast.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``args`` : List of pads to be placed
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PadSouth ( self.p_cin, self.p_np, self.p_ng, self.p_vssick0
|
|||
|
, self.p_vddeck0, self.p_vsseck1, self.p_vddeck1, self.p_cout
|
|||
|
, self.p_y[0], self.p_y[1], self.p_y[2]
|
|||
|
)
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] PadNorth : not enough space for all pads.``
|
|||
|
The abutment box is not big enough in order to place all the pads.
|
|||
|
Maybe one could put pads on other faces of the cell.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PadNorth : one instance doesn't exist.``
|
|||
|
One of the pads given as arguments does not exist
|
|||
|
|
|||
|
- ``[Stratus ERROR] PadNorth : one argument is not an instance.``
|
|||
|
One of the pads is not one of the pads of the cell.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PadNorth : the instance ins is already placed.``
|
|||
|
One is trying to place a pad twice.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PadNorth : pad ins must be closer to the center.``
|
|||
|
The pad name ins must be put closer to the center in order to route
|
|||
|
the cell
|
|||
|
|
|||
|
Alimentation rails
|
|||
|
------------------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
AlimVerticalRail, AlimHorizontalRail – Placement of a
|
|||
|
vertical/horizontal alimentation call back
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
AlimVerticalRail ( nb )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
These functions place a vertical/horizontal alimentation call back. It’s
|
|||
|
position is given by the parameter given.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``nb`` : coordinate of the rail
|
|||
|
|
|||
|
- For AlimVerticalRail, ``nb`` is in pitches i.e. 5 lambdas
|
|||
|
|
|||
|
- For AlimHorizontalRail, ``nb`` is in slices i.e. 50 lambdas
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
AlimVerticalRail ( 50 )
|
|||
|
AlimVerticalRail ( 150 )
|
|||
|
|
|||
|
AlimHorizontalRail ( 10 )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] AlimHorizontalRail :``
|
|||
|
``Illegal argument y, y must be between ... and ...``
|
|||
|
The argument given is wrong : the call back would not be in the
|
|||
|
abutment box.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Placement of cells :``
|
|||
|
``please check your file of layout with DRUC.``
|
|||
|
The placement of the cell needs to be correct in order to place a
|
|||
|
call back. Check the errors of placement.
|
|||
|
|
|||
|
Alimentation connectors
|
|||
|
-----------------------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
AlimConnectors – Creation of connectors at the periphery of the core of
|
|||
|
a circuit
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
AlimConnectors()
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function creates the connectors in Alu 1 at the periphery of the
|
|||
|
core.
|
|||
|
|
|||
|
PowerRing
|
|||
|
---------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
PowerRing – Placement of power rings.
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PowerRing ( nb )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function places power rings around the core and around the plots.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``nb`` : Number of pair of rings vdd/vss
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
PowerRing ( 3 )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] PowerRing : Pads in the north haven't been placed.``
|
|||
|
The pads of the 4 sides of the chip must be placed before calling
|
|||
|
function PowerRing.
|
|||
|
|
|||
|
- ``[Stratus ERROR] PowerRing : too many rings, not enough space.``
|
|||
|
Wether The argument of PowerRing is to big, or the abutment box of
|
|||
|
the chip is to small. There’s no space to put the rings.
|
|||
|
|
|||
|
RouteCk
|
|||
|
-------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
RouteCk – Routing of signal Ck to standard cells
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
RouteCk ( net )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This function routes signal Ck to standard cells.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``net`` : the net which the fonction is applied to
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] RouteCk : Pads in the north haven't been placed``
|
|||
|
The pads must be placed before calling RoutageCk.
|
|||
|
|
|||
|
Instanciation facilities
|
|||
|
========================
|
|||
|
|
|||
|
Buffer
|
|||
|
------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Buffer – Easy way to instantiate a buffer
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
netOut <= netIn.Buffer()
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This method is a method of net. The net which this method is applied
|
|||
|
to is the input net of the buffer. The method returns a net : the output
|
|||
|
net.
|
|||
|
Note that it is possible to change the generator instanciated with the
|
|||
|
``SetBuff`` method.
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.A = SignalIn ( "a", 4 )
|
|||
|
|
|||
|
self.S = SignalOut ( "s", 4 )
|
|||
|
|
|||
|
self.Vdd = VddIn ( "vdd" )
|
|||
|
self.Vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.S <= self.A.Buffer()
|
|||
|
|
|||
|
Multiplexor
|
|||
|
-----------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Mux – Easy way to instantiate a multiplexor
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
netOut <= netCmd.Mux ( arg )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This method is a method of net. The net which this method is applied
|
|||
|
to is the command of the multiplexor. The nets given as parameters are
|
|||
|
all the input nets. This method returns a net : the output net.
|
|||
|
There are two ways to describe the multiplexor : the argument ``arg``
|
|||
|
can be a list or a dictionnary.
|
|||
|
Note that it is possible to change the generator instanciated with the
|
|||
|
``SetMux`` method.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- List :
|
|||
|
For each value of the command, the corresponding net is specified.
|
|||
|
All values must be specified.
|
|||
|
For example :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
out <= cmd.Mux ( [in0, in1, in2, in3] )
|
|||
|
|
|||
|
|
|||
|
The net out is then initialised like this :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
if cmd == 0 : out <= in0
|
|||
|
if cmd == 1 : out <= in1
|
|||
|
if cmd == 2 : out <= in2
|
|||
|
if cmd == 3 : out <= in3
|
|||
|
|
|||
|
|
|||
|
- Dictionnary :
|
|||
|
A dictionnary makes the correspondance between a value of the
|
|||
|
command and the corresponding net.
|
|||
|
For example :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
out <= cmd.Mux ( {"0" : in0, "1" : in1, "2" : in2, "3" : in3} )
|
|||
|
|
|||
|
|
|||
|
This initialisation corresponds to the one before. Thanks to the use
|
|||
|
of a dictionnary, the connections can be clearer :
|
|||
|
|
|||
|
- ``'default'``: This key of the dictionnary corresponds to all
|
|||
|
the nets that are not specified
|
|||
|
For example :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
out <= cmd.Mux ( {"0" : in0, "default" : in1} )
|
|||
|
|
|||
|
|
|||
|
This notation corresponds to :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
if cmd == 0 : out <= in0
|
|||
|
else : out <= in1
|
|||
|
|
|||
|
|
|||
|
Note that if there is no ``'default'`` key specified and that not
|
|||
|
all the nets are specified, the non specified nets are set to 0.
|
|||
|
|
|||
|
- ``#`` and ``?`` : When a key of the dictionnary begins with
|
|||
|
``#``, the number after the ``#`` has to be binary and each ? in
|
|||
|
the number means that this bit is not precised
|
|||
|
For example :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
out <= cmd.Mux ( {"#01?" : in0, "default" : in1} )
|
|||
|
|
|||
|
|
|||
|
This notation corresponds to :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
if cmd in ( 2, 3 ) : out <= in0
|
|||
|
else : out <= in1
|
|||
|
|
|||
|
|
|||
|
- ``,`` and ``-`` : When keys contains thoses symbols, it permits
|
|||
|
to enumerate intervals
|
|||
|
For example :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
out <= cmd.Mux ( {"0,4" : in0, "1-3,5" : in1} )
|
|||
|
|
|||
|
|
|||
|
This notation corresponds to :
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
if cmd in ( 0, 4 ) : out <= in0
|
|||
|
elif cmd in ( 1, 2, 3, 5) : out <= in1
|
|||
|
else : out <= 0
|
|||
|
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.A = SignalIn ( "a", 4 )
|
|||
|
self.B = SignalIn ( "b", 4 )
|
|||
|
self.C = SignalIn ( "c", 4 )
|
|||
|
self.D = SignalIn ( "d", 4 )
|
|||
|
|
|||
|
self.Cmd1 = SignalIn ( "cmd1", 2 )
|
|||
|
self.Cmd2 = SignalIn ( "cmd2", 4 )
|
|||
|
|
|||
|
self.S1 = SignalOut ( "s1", 4 )
|
|||
|
self.S2 = SignalOut ( "s2", 4 )
|
|||
|
|
|||
|
self.Vdd = VddIn ( "vdd" )
|
|||
|
self.Vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.S1 <= self.Cmd1.Mux ( [sefl.A, self.B, self.C, self.D] )
|
|||
|
|
|||
|
self.S2 <= self.Cmd2.Mux ( { "0" : self.A
|
|||
|
, "1,5-7" : self.B
|
|||
|
, "#1?1?" : self.C
|
|||
|
, "default" : self.D
|
|||
|
} )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux : all the nets must have the same lenght.``
|
|||
|
All the input nets pust have the same lenght.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux : there are no input nets.``
|
|||
|
The input nets seem to have been forgotten.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux : wrong argument type.``
|
|||
|
The connections of the buses are not described by a list nor a
|
|||
|
dictionnary.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux :``
|
|||
|
``the number of nets does not match with the lenght of the command.``
|
|||
|
When using a list, the number of nets has to correspond to the
|
|||
|
number of possible values of the command.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux : wrong key.``
|
|||
|
One of the key of the dictionnary is not un number, neither a list
|
|||
|
or an interval.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux :``
|
|||
|
``when an interval is specified, the second number of the interval``
|
|||
|
``must be greater than the first one.``
|
|||
|
When creating an interval with “-”, the second number has to be
|
|||
|
greater than the first one.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux :``
|
|||
|
``the binary number does not match with the lenght of the command.``
|
|||
|
When using the ``#`` notation, each digit of the binary number
|
|||
|
corresponds to a wire of the cmd. The leghts have to correspond.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Mux : after #, the number has to be binary.``
|
|||
|
When using the ``#`` notation, the number has to be binary : one
|
|||
|
can use 0, 1 or ?.
|
|||
|
|
|||
|
Shifter
|
|||
|
-------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Shift – Easy way to instantiate a shifter
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
netOut <= netCmd.Shift ( netIn, direction, type )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This method is a method of net. The net which this method is applied
|
|||
|
to is the command of the shifter, it’s the one which defines the number
|
|||
|
of bits to shift. The net given as parameter is the input net. The other
|
|||
|
arguments set the different patameters. The method returns a net : the
|
|||
|
output net.
|
|||
|
Note that it is possible to change the generator instanciated with the
|
|||
|
``SetShift`` method.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- ``netIn`` : the net which is going to be shifted
|
|||
|
|
|||
|
- ``direction`` : this string represents the direction of the shift :
|
|||
|
|
|||
|
- “left”
|
|||
|
|
|||
|
- “right”
|
|||
|
|
|||
|
- ``type`` : this string represents the type of the shift :
|
|||
|
|
|||
|
- “logical” : only “zeros” are put in the net
|
|||
|
|
|||
|
- “arith” : meaningful for “right” shift, the values put in the nets
|
|||
|
are an extension of the MSB
|
|||
|
|
|||
|
- “circular” : the values put in the nets are the ones which have
|
|||
|
just been taken off
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.A = SignalIn ( "a", 4 )
|
|||
|
|
|||
|
self.Cmd = SignalIn ( "cmd", 2 )
|
|||
|
|
|||
|
self.S1 = SignalOut ( "s1", 4 )
|
|||
|
self.S2 = SignalOut ( "s2", 4 )
|
|||
|
self.S3 = SignalOut ( "s3", 4 )
|
|||
|
|
|||
|
self.Vdd = VddIn ( "vdd" )
|
|||
|
self.Vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.S1 <= self.Cmd.Shift ( self.A, "right", "logical" )
|
|||
|
self.S2 <= self.Cmd.Shift ( self.A, "right", "arith" )
|
|||
|
|
|||
|
self.S3 <= self.Cmd.Shift ( self.A, "left", "circular" )
|
|||
|
|
|||
|
If the value of “a” is “0b1001” and the value of “cmd” is “0b10”, we
|
|||
|
will have :
|
|||
|
|
|||
|
- “s1” : “0b0010”
|
|||
|
|
|||
|
- “s2” : “0b1110”
|
|||
|
|
|||
|
- “s3” : “0b0110”
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Shift :``
|
|||
|
``The input net does not have a positive arity.``
|
|||
|
The net which is going to be shifted must have a positive arity.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Shift :``
|
|||
|
``The direction parameter must be "left" or "right".``
|
|||
|
The “direction” argument is not correct.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Shift :``
|
|||
|
``The type parameter must be "logical" or "arith" or "circular".``
|
|||
|
The “type” argument is not correct.
|
|||
|
|
|||
|
Register
|
|||
|
--------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Reg – Easy way to instantiate a register
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
netOut <= netCk.Reg ( netIn )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
This method is a method of net. The net which this method is applied
|
|||
|
to is the clock of the register. The net given as parameter is the input
|
|||
|
net. The method returns a net : the output net.
|
|||
|
Note that it is possible to change the generator instanciated with the
|
|||
|
``SetReg`` method.
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.A = SignalIn ( "a", 4 )
|
|||
|
self.S = SignalOut ( "s", 4 )
|
|||
|
|
|||
|
self.Ck = CkIn ( "ck" )
|
|||
|
|
|||
|
self.Vdd = VddIn ( "vdd" )
|
|||
|
self.Vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.S <= self.Ck.Reg ( self.A )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Reg : The input net does not have a positive arity.``
|
|||
|
The input net must have a positive arity.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Reg : The clock does not have a positive arity.``
|
|||
|
The clock must have a positive arity.
|
|||
|
|
|||
|
Constants
|
|||
|
---------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Constant – Easy way to instantiate constants
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
netOne <= One ( 2 )
|
|||
|
|
|||
|
net8 <= "8"
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
These functions simplify the way to instanciate constants.
|
|||
|
|
|||
|
- The functions ``One`` and\ ``Zero`` permits to initialise all the
|
|||
|
bits of a net to ’one’ or ’zero’.
|
|||
|
|
|||
|
- The instanciation of a constant thanks to a string can be done in
|
|||
|
decimal, hecadecimal or binary.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
- For ``One`` and ``Zero`` :
|
|||
|
|
|||
|
- ``n`` : the arity of the net
|
|||
|
|
|||
|
- For the instanciation of a constant :
|
|||
|
|
|||
|
- the constant given must be a string representing :
|
|||
|
|
|||
|
- A decimal number
|
|||
|
|
|||
|
- A binary number : the string must begin with “0b”
|
|||
|
|
|||
|
- An hexadecimal number : the string must begin with “0x”
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.Ones = SignalOut ( "ones", 2 )
|
|||
|
self.Zeros = SignalOut ( "zeros", 4 )
|
|||
|
|
|||
|
self.Eight = SignalOut ( "eight", 4 )
|
|||
|
self.Twentu = SignalOut ( "twenty", 5 )
|
|||
|
self.Two = SignalOut ( "two", 5 )
|
|||
|
|
|||
|
self.Vdd = VddIn ( "vdd" )
|
|||
|
self.Vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.Ones <= One ( 2 )
|
|||
|
self.Zero <= Zero ( 4 )
|
|||
|
|
|||
|
self.Eight <= "8"
|
|||
|
self.Twenty <= "0x14"
|
|||
|
self.Two <= "0b10"
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Const :``
|
|||
|
``the argument must be a string representing a number in decimal,``
|
|||
|
``binary (0b) or hexa (0x).``
|
|||
|
The string given as argument does not have the right form.
|
|||
|
|
|||
|
Boolean operations
|
|||
|
------------------
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Most common boolean operators can be instantiated without the ``Inst``
|
|||
|
constructor.
|
|||
|
|
|||
|
List
|
|||
|
~~~~
|
|||
|
|
|||
|
Boolean operators are listed below :
|
|||
|
|
|||
|
- ``And2`` : ``q <= i0 & i1``
|
|||
|
|
|||
|
- ``Or2`` : ``q <= i0 | i1``
|
|||
|
|
|||
|
- ``Xor2`` : ``q <= i0 ^ i1``
|
|||
|
|
|||
|
- ``Inv`` : ``q <= ~i0``
|
|||
|
|
|||
|
Generators to instantiate
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
One can choose the generator to be used. Some methods are applied to
|
|||
|
the cell and set the generator used when using ``&``, ``|``, ``^`` and
|
|||
|
``~``. The generators used by default are the ones from the virtual
|
|||
|
library.
|
|||
|
|
|||
|
Methods are :
|
|||
|
|
|||
|
- ``SetAnd``
|
|||
|
|
|||
|
- ``SetOr``
|
|||
|
|
|||
|
- ``SetXor``
|
|||
|
|
|||
|
- ``SetNot``
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.A = SignalIn ( "a", 4 )
|
|||
|
self.B = SignalIn ( "b", 4 )
|
|||
|
self.B = SignalIn ( "c", 4 )
|
|||
|
|
|||
|
self.S = SignalOut ( "s", 4 )
|
|||
|
|
|||
|
self.vdd = VddIn ( "vdd" )
|
|||
|
self.vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.S <= ( ~self.A & self.B ) | self.C
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] & : the nets must have the same lenght.``
|
|||
|
When one uses boolean expressions, one has to check that the sizes
|
|||
|
of both nets are equivalent.
|
|||
|
|
|||
|
- ``[Stratus ERROR] : there is no alim.``
|
|||
|
The cell being created does not have the alimentation nets. The
|
|||
|
instanciation is impossible.
|
|||
|
|
|||
|
Arithmetical operations
|
|||
|
-----------------------
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Most common arithmetic operators can be instantiated without the
|
|||
|
``Inst`` constructor.
|
|||
|
|
|||
|
List
|
|||
|
~~~~
|
|||
|
|
|||
|
Arithmetical operators are listed below :
|
|||
|
|
|||
|
- ``Addition`` : ``q <= i0 + i1``
|
|||
|
|
|||
|
- ``Substraction`` : ``q <= i0`` - ``i1``
|
|||
|
|
|||
|
- ``Multiplication`` : ``q <= i0 * i1``
|
|||
|
|
|||
|
- ``Division`` : ``q <= i0 / i1``
|
|||
|
|
|||
|
Generators to instantiate
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
One can choose the generator to be used. Some methods are applied to the
|
|||
|
cell and set the generator used when using overloard. Methods are :
|
|||
|
|
|||
|
- ``SetAdd`` (for addition and substraction)
|
|||
|
|
|||
|
- ``SetMult``
|
|||
|
|
|||
|
- ``SetDiv``
|
|||
|
|
|||
|
The generators used by default are :
|
|||
|
|
|||
|
- ``Addition`` : Slansky adder
|
|||
|
|
|||
|
- ``Substraction`` : Slansky adder + inversor + cin = ’1’
|
|||
|
|
|||
|
- ``Multiplication`` : CA2 multiplier (signed, modified booth/Wallace
|
|||
|
tree)
|
|||
|
|
|||
|
- ``Division`` : not available yet
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.A = SignalIn ( "a", 4 )
|
|||
|
self.B = SignalIn ( "b", 4 )
|
|||
|
|
|||
|
self.S = SignalOut ( "s", 4 )
|
|||
|
|
|||
|
self.T = SignalOut ( "t", 8 )
|
|||
|
|
|||
|
self.vdd = VddIn ( "vdd" )
|
|||
|
self.vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.S <= self.A + self.B
|
|||
|
|
|||
|
self.T <= self.A * self.B
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] + : the nets must have the same lenght.``
|
|||
|
When one uses arithmetic expressions, one has to check that the
|
|||
|
sizes of both nets are equivalent.
|
|||
|
|
|||
|
- ``[Stratus ERROR] : there is no alim.``
|
|||
|
The cell being created does not have the alimentation nets. The
|
|||
|
instanciation is impossible.
|
|||
|
|
|||
|
Comparison operations
|
|||
|
---------------------
|
|||
|
|
|||
|
Name
|
|||
|
~~~~
|
|||
|
|
|||
|
Eq/Ne : Easy way to test the value of the nets
|
|||
|
|
|||
|
Synopsys
|
|||
|
~~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
netOut <= net.Eq ( "n" )
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
Comparaison functions are listed below :
|
|||
|
|
|||
|
- ``Eq`` : returns ``true`` if the value of the net is equal to ``n``.
|
|||
|
|
|||
|
- ``Ne`` : returns ``true`` if the value of the net is different from
|
|||
|
``n``.
|
|||
|
|
|||
|
Note that it is possible to change the generator instanciated with the
|
|||
|
``SetComp`` method.
|
|||
|
|
|||
|
Parameters
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
The constant given as argument must be a string representing :
|
|||
|
|
|||
|
- A decimal number
|
|||
|
|
|||
|
- A binary number : the string must begin with “0b”
|
|||
|
|
|||
|
- An hexadecimal number : the string must begin with “0x”
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
class essai ( Model ) :
|
|||
|
|
|||
|
def Interface ( self ) :
|
|||
|
self.A = SignalIn ( "a", 4 )
|
|||
|
|
|||
|
self.S = SignalOut ( "s", 1 )
|
|||
|
self.T = SignalOut ( "t", 1 )
|
|||
|
|
|||
|
self.vdd = VddIn ( "vdd" )
|
|||
|
self.vss = VssIn ( "vss" )
|
|||
|
|
|||
|
def Netlist ( self ) :
|
|||
|
|
|||
|
self.S <= self.A.Eq ( "4" )
|
|||
|
|
|||
|
self.T <= self.A.Ne ( "1" )
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Eq :``
|
|||
|
``the number does not match with the net's lenght.``
|
|||
|
When one uses comparaison functions on one net, one has to check
|
|||
|
that the number corresponds to the size of the net.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Eq :``
|
|||
|
``the argument must be a string representing a number in decimal,``
|
|||
|
``binary (0b) or hexa (0x).``
|
|||
|
The string given as argument does not have the right form.
|
|||
|
|
|||
|
Virtual library
|
|||
|
---------------
|
|||
|
|
|||
|
Description
|
|||
|
~~~~~~~~~~~
|
|||
|
|
|||
|
The virtual library permits to create a cell and map it to different
|
|||
|
libraries without having to change it.
|
|||
|
|
|||
|
List of the generators provided
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
- ``a2`` : ``q <= i0 & i1``
|
|||
|
|
|||
|
- ``a3`` : ``q <= i0 & i1 & i2``
|
|||
|
|
|||
|
- ``a4`` : ``q <= i0 & i1 & i2 & i3``
|
|||
|
|
|||
|
- ``na2`` : ``nq <= ~ ( i0 & i1 )``
|
|||
|
|
|||
|
- ``na3`` : ``nq <= ~ ( i0 & i1 & i2 )``
|
|||
|
|
|||
|
- ``na4`` : ``nq <= ~ ( i0 & i1 & i2 & i3 )``
|
|||
|
|
|||
|
- ``o2`` : ``q <= i0 & i1``
|
|||
|
|
|||
|
- ``o3`` : ``q <= i0 & i1 & i2``
|
|||
|
|
|||
|
- ``o4`` : ``q <= i0 & i1 & i2 & i3``
|
|||
|
|
|||
|
- ``no2`` : ``nq <= ~ ( i0 & i1 )``
|
|||
|
|
|||
|
- ``no3`` : ``nq <= ~ ( i0 & i1 & i2 )``
|
|||
|
|
|||
|
- ``no4`` : ``nq <= ~ ( i0 & i1 & i2 & i3 )``
|
|||
|
|
|||
|
- ``inv`` : ``nq <= ~ i``
|
|||
|
|
|||
|
- ``buf`` : ``q <= i``
|
|||
|
|
|||
|
- ``xr2`` : ``q <= i0 ^ i1``
|
|||
|
|
|||
|
- ``nxr2`` : ``nq <= ~ ( i0 ^ i1 )``
|
|||
|
|
|||
|
- ``zero`` : ``nq <= '0'``
|
|||
|
|
|||
|
- ``one`` : ``q <= '1'``
|
|||
|
|
|||
|
- ``halfadder`` : ``sout <= a ^ b`` and ``cout <= a & b``
|
|||
|
|
|||
|
- ``fulladder`` : ``sout <= a ^ b ^ cin``
|
|||
|
and ``cout <= ( a & b ) | ( a & cin ) | ( b & cin )``
|
|||
|
|
|||
|
- ``mx2`` : ``q <= (i0 & ~cmd) | (i1 & cmd)``
|
|||
|
|
|||
|
- ``nmx2`` : ``nq <= ~( (i0 & ~cmd) | (i1 & cmd) )``
|
|||
|
|
|||
|
- ``sff`` : ``if RISE ( ck ) : q <= i``
|
|||
|
|
|||
|
- ``sff2`` : ``if RISE ( ck ) : q <= (i0 & ~cmd) | (i1 & cmd)``
|
|||
|
|
|||
|
- ``sff3`` : ``if RISE ( ck ) :``
|
|||
|
`` q <= (i0 & ~cmd0) | (((i1 & cmd1)|(i2&~cmd1)) & cmd0)``
|
|||
|
|
|||
|
- ``ts`` : ``if cmd : q <= i``
|
|||
|
|
|||
|
- ``nts`` : ``if cmd : nq <= ~i``
|
|||
|
|
|||
|
Mapping file
|
|||
|
~~~~~~~~~~~~
|
|||
|
|
|||
|
The virtual library is mapped to the sxlib library. A piece of the
|
|||
|
corresponding mapping file is shown below.
|
|||
|
In order to map the virtual library to another library, on has to
|
|||
|
write a .xml file which makes correspond models and interfaces.
|
|||
|
Note that the interfaces of the cells must be the same (except for the
|
|||
|
names of the ports). Otherwise, one has to create .vst file in order to
|
|||
|
make the interfaces match.
|
|||
|
|
|||
|
The environment variable used to point the right file is
|
|||
|
``STRATUS_MAPPING_NAME``.
|
|||
|
|
|||
|
|xml|
|
|||
|
|
|||
|
Generators
|
|||
|
~~~~~~~~~~
|
|||
|
|
|||
|
Some generators are also provided in order to use the cells of the
|
|||
|
library with nets of more than 1 bit. One has to upper the first letter
|
|||
|
of the model name in order to user those generators. What is simply done
|
|||
|
is a for loop with the bits of the nets. The parameter ``'nbit'`` gives
|
|||
|
the size of the generator.
|
|||
|
|
|||
|
Example
|
|||
|
~~~~~~~
|
|||
|
|
|||
|
- Direct instanciation of a cell
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
for i in range ( 4 ) :
|
|||
|
Inst ( 'a2'
|
|||
|
, map = { 'i0' : neti0[i]
|
|||
|
, 'i1' : neti1[i]
|
|||
|
, 'q' : netq[i]
|
|||
|
, 'vdd' : netvdd
|
|||
|
, 'vss' : netvss
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
- Instanciation of a generator
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Generate ( 'A2', "my_and2_4bits", param = { 'nbit' : 4 } )
|
|||
|
Inst ( 'my_and2_4bits'
|
|||
|
, map = { 'i0' : neti0
|
|||
|
, 'i1' : neti1
|
|||
|
, 'q' : netq
|
|||
|
, 'vdd' : vdd
|
|||
|
, 'vss' : vss
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
Errors
|
|||
|
~~~~~~
|
|||
|
|
|||
|
Some errors may occur :
|
|||
|
|
|||
|
- ``[Stratus ERROR] Inst : the model ... does not exist.``
|
|||
|
``Check CRL_CATA_LIB.``
|
|||
|
The model of the cell has not been found. One has to check the
|
|||
|
environment variable.
|
|||
|
|
|||
|
- ``[Stratus ERROR] Virtual library : No file found in order to parse.``
|
|||
|
``Check STRATUS_MAPPING_NAME.``
|
|||
|
The mapping file is not given in the environment variable.
|
|||
|
|
|||
|
Useful links
|
|||
|
============
|
|||
|
|
|||
|
DpGen generators
|
|||
|
----------------
|
|||
|
|
|||
|
You can find the documentation of the DPGEN library at :
|
|||
|
file:./DpGen.html
|
|||
|
|
|||
|
Arithmetic package of stratus
|
|||
|
-----------------------------
|
|||
|
|
|||
|
You can find the documentation of the arithmetic stratus’s package at:
|
|||
|
file:////users/outil/arith/latest/modules_stratus/arithmetic/doc/arith/index.html
|
|||
|
|
|||
|
Arithmetic generators and some stratus packages
|
|||
|
-----------------------------------------------
|
|||
|
|
|||
|
You can find the documentation of the arithmetic library at :
|
|||
|
file:////users/outil/arith/latest/doc/index.html
|
|||
|
|
|||
|
Patterns module
|
|||
|
---------------
|
|||
|
|
|||
|
You can find the documentation of the patterns module :
|
|||
|
file:../patterns/index.html
|
|||
|
|
|||
|
.. |add1| image:: ./images/add1.png
|
|||
|
.. |add2| image:: ./images/add2.png
|
|||
|
.. |addaccu| image:: ./images/addaccu.png
|
|||
|
.. |test| image:: ./images/test.png
|
|||
|
.. |editor| image:: ./images/editor.png
|
|||
|
.. |resize| image:: ./images/resizeAb.png
|
|||
|
.. |xml| image:: images/xml.png
|