From 0f8b767f1b0019a99c0e8100290553ff1995f067 Mon Sep 17 00:00:00 2001 From: Roselyne Chotin-Avot Date: Tue, 25 Apr 2017 16:18:18 +0200 Subject: [PATCH 1/4] createPartRing do not be there ??? use the python notation [-1] to access last bit of a net --- stratus1/src/stratus/st_net.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/stratus1/src/stratus/st_net.py b/stratus1/src/stratus/st_net.py index f32c37fb..102eee09 100644 --- a/stratus1/src/stratus/st_net.py +++ b/stratus1/src/stratus/st_net.py @@ -111,6 +111,8 @@ class net : ##### For buses ##### def __getitem__ ( self, indice ) : + if indice == -1: + return Sig ( self, self._ind + self._arity - 1 ) if ( indice < self._ind ) or ( indice >= ( self._ind + self._arity ) ) : err = "\n[Stratus ERROR] [] : bad index " + str(indice) + " for net : " \ + self._name + " of arity " + str(self._arity) @@ -234,8 +236,8 @@ class net : if self._st_cell._hur_cell : net.hur_merge() - for i in range ( net._arity ) : - CRL.createPartRing ( self._st_cell._hur_cell, netInCell._hur_net[i+self._ind].getName() ) # FIXME plante avec le adder mixed dans un cas particulier indetermine .... + #for i in range ( net._arity ) : + # CRL.createPartRing ( self._st_cell._hur_cell, netInCell._hur_net[i+self._ind].getName() ) # FIXME plante avec le adder mixed dans un cas particulier indetermine .... ##### Instanciation of a buffer ##### def Buffer ( self ) : From 6580c485fa0ae75c95261be08405df703e699899 Mon Sep 17 00:00:00 2001 From: Roselyne Chotin-Avot Date: Wed, 2 Aug 2017 10:38:48 +0200 Subject: [PATCH 2/4] Add VHDL driver --- stratus1/src/stratus/st_export.py | 179 ++++++++++++++++++++++++++++++ stratus1/src/stratus/st_model.py | 21 ++-- stratus1/src/stratus/st_net.py | 2 +- 3 files changed, 193 insertions(+), 9 deletions(-) create mode 100644 stratus1/src/stratus/st_export.py diff --git a/stratus1/src/stratus/st_export.py b/stratus1/src/stratus/st_export.py new file mode 100644 index 00000000..c7a6a730 --- /dev/null +++ b/stratus1/src/stratus/st_export.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python +# +# -*- mode:Python -*- +# +# This file is part of the Coriolis Software. +# Copyright (c) UPMC/LIP6 2008-2017, All Rights Reserved +# +# +-----------------------------------------------------------------+ +# | C O R I O L I S | +# | S t r a t u s - Netlists/Layouts Description | +# | | +# | Author : Roselyne CHOTIN-AVOT | +# | E-mail : Roselyne.Chotin-Avot@lip6.fr | +# | =============================================================== | +# | Py Module : "./st_export.py" | +# +-----------------------------------------------------------------+ + +import os + +from st_model import Model +from st_net import net + +sep = " " + +# the list of components is updated at each new model to avoid to re-create them +COMPONENTS ={} + +def write(model,format,extraLibs = []): + if format == 'vhd': + # create component for virtual library + BV2VHDComponents() + # remove all previous generation of files + os.system("rm -f *.vhd *.vst") + # create the VHDL model of the cell + obj = VHDModel(model,extraLibs) + else: + raise "Not yet implemented format %s" %(format) + # write the file + obj.write() + +# create component for virtual library +def BV2VHDComponents(): + from st_parser import BV + from st_getrealmodel import GetRealModel + + for model in BV: + (realM,inout) = GetRealModel(model) + component = sep + "component %s\n" %realM + sep + "port (\n" + for pin in inout: + # stratus makes the asumption that pin names depend of the direction + if pin in ['q','nq','sout','cout']: direct = "OUT" + else: direct = "IN" + component += sep + "%s: %s std_logic;\n" %(pin,direct) + COMPONENTS[realM] = component[0:-2] + "\n" + sep + ");\n" + +# Associated VHDL of stratus Model +# Create associated VHDL for : +# - libraries +# - ports +# - instances +# - and internal signals +class VHDModel(): + def __init__(self, cell, extraLibs = []): + self._cell = cell + self._extraLibs = extraLibs + self._str = "" + self.model2vhd() + self.write() + + def model2vhd(self): + self._str += self.librairies2vhd() + self._str += "entity " + self._cell._name + " is\n" + self._str += self.ports2vhd() + self._str += "end " + self._cell._name + ";\n" + self._str += "\narchitecture structural of %s is\n" %self._cell._name + self.insts2vhd() + self._str += self._components + self._str += self.sig2vhd() + self._str += "begin\n" + self._str += self._insts + self._str += "end structural;\n" + COMPONENTS[self._cell._name] = sep + "component %s\n" %self._cell._name + self._ports + sep + "end component;\n" + + def librairies2vhd(self): + self._libs = "library ieee;\n" + self._libs += "use ieee.std_logic_1164.all;\n\n" + # the model used standard cells + if 'realModel' in self._cell._param : + self._libs += "library sxlib;\n" + self._libs += "use sxlib.all;\n\n" + for lib in self._extraLibs: + self._libs = self._libs + lib + ";\n" + return self._libs + + def ports2vhd(self): + self._ports = sep + "port(\n" + for port in self._cell._st_ports + self._cell._st_cks: + self._ports += sep + sep + VHDNet(port)._str + self._ports = self._ports[0:-2] + self._ports += "\n" + sep + ");\n" + return self._ports + + def insts2vhd(self): + self._insts = "" + self._components = "" + # list of the components of this model + insts_components = [] + for inst in self._cell._st_insts: + vhd_inst = VHDInst(inst) + self._insts += vhd_inst._str + # if it is not already present we add it + if inst._model not in insts_components: + insts_components.append(inst._model) + self._components += COMPONENTS[inst._model] + return self._insts + + def sig2vhd(self): + self._sigs = "" + for sig in self._cell._st_sigs: + self._sigs += sep + "signal " + VHDNet(sig)._str + return self._sigs + + def write(self): + format = 'vhd' + file = open(self._cell._name + "." + format, "w+") + file.write( "--\n" ) + file.write( "-- Generated by Stratus export format %s\n" %format ) + file.write( "--\n" ) + file.write(self._str) + file.close() + +# Associated VHDL of stratus Net +class VHDNet(): + def __init__(self, net): + direct = "" + # only external signals have a direction + if net._ext: + direct = net._direct + self._str = "%s : %s std_logic" %(net._name,direct) + if net._arity != 1: + self._str += "_vector(%d downto 0)" %net._arity + self._str += ";\n" + +# Associated VHDL of stratus Inst +class VHDInst(): + def __init__(self, inst): + # if the model is not yet in the components list we have to create it + if inst._model not in COMPONENTS: + model = VHDModel(inst._st_masterCell) + self._str = sep + inst._name + " : " + inst._model + "\n" + self._str += sep + sep + "port map (\n" + for (k,v) in inst._map.iteritems(): + # the alim are not present in VHDL + if not v._h_type or v._h_type not in ["POWER", "GROUND"]: + # change the stratus' slice [] in VHDL's one () + name = v._name.replace('[','(').replace(']',')') + self._str += sep + sep + sep +"%s => %s,\n" %(k,name) + self._str = self._str[0:-2] + self._str += "\n" + sep + sep + ");\n" + +class VLog: + def __init__(self, cell): + raise "Not yet implemented" + +## class VLogModel(ExportModel): +## def __init__(self): +## Export.__init__(self) + +## def createEntity(self): +## ports = createPorts() +## res = "module " + self._cell._name + " (\n" +## res += ports[0] +## res += ");\n" +## res += ports[1] +## return res + +class Json: + def __init__(self, cell): + raise "Not yet implemented" diff --git a/stratus1/src/stratus/st_model.py b/stratus1/src/stratus/st_model.py index 32476d82..37fd9a36 100644 --- a/stratus1/src/stratus/st_model.py +++ b/stratus1/src/stratus/st_model.py @@ -43,7 +43,7 @@ def setEditor ( editor ): ####################### ##### Class Model ##### ####################### -class Model : +class Model() : ########################## ##### Initialisation ##### @@ -447,16 +447,13 @@ class Model : if views == STRATUS : self.exportStratus ( fileName ) - elif netlistFormat in ['vst','vhd'] : + elif netlistFormat == 'vst' : UpdateSession.open() hurCell = self._hur_cell if str ( hurCell.getName() ) != "__Scratch__" : - if netlistFormat == 'vst' : - FRAMEWORK.saveCell ( hurCell, views|CRL.Catalog.State.Logical ) - else : - self.exportVHD() + FRAMEWORK.saveCell ( hurCell, views|CRL.Catalog.State.Logical ) if len ( CELLS ) == 0 : err = "\n[Stratus ERROR] Save : CELLS stack is empty.\n" @@ -469,8 +466,8 @@ class Model : elif netlistFormat == 'stratus' : self.exportStratus ( fileName ) - elif netlistFormat == 'vlog' : - raise Exception('Format %s not yet implemented' % netlistFormat) + elif netlistFormat in ['vhd','vlog','json'] : + self.export(netlistFormat) else : raise Exception('Unrecognized format %s' % netlistFormat) @@ -722,6 +719,14 @@ class Model : ##### End ##### file.close () + ##### Export the given database in the given format + def export ( self, format): + from st_export import write + + if format not in ['vhd','vlog','json']: + raise "Unrecognized format %s" %(format) + write(self,format) + ##### Create a IEEE VHDL file given the database ##### def exportVHD ( self ) : diff --git a/stratus1/src/stratus/st_net.py b/stratus1/src/stratus/st_net.py index 102eee09..d5630787 100644 --- a/stratus1/src/stratus/st_net.py +++ b/stratus1/src/stratus/st_net.py @@ -886,6 +886,7 @@ class net : self._to_cat = [] self._real_net = None self._ext = extern + self._h_type = hType if extern : self._direct = direction # Error : @@ -894,7 +895,6 @@ class net : raise Exception ( err ) if hType : - self._h_type = hType if hType == "POWER" : self._st_cell._st_vdds.append ( self ) elif hType == "GROUND" : self._st_cell._st_vsss.append ( self ) elif hType == "CLOCK" : self._st_cell._st_cks.append ( self ) From d7c93e3f2a523d64b0bcee6a0a6f01b9ca7968f7 Mon Sep 17 00:00:00 2001 From: Roselyne Chotin-Avot Date: Fri, 10 Aug 2018 14:36:46 +0200 Subject: [PATCH 3/4] To be compatible with clang --- katana/src/katana/RoutingEvent.h | 4 ++-- katana/src/katana/TrackCost.h | 4 ++-- .../src/configuration/src/vlsisapd/configuration/Parameter.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/katana/src/katana/RoutingEvent.h b/katana/src/katana/RoutingEvent.h index 2367bca9..b79f39d9 100644 --- a/katana/src/katana/RoutingEvent.h +++ b/katana/src/katana/RoutingEvent.h @@ -124,7 +124,7 @@ namespace Katana { inline const vector& getPerpandiculars () const; inline DbU::Unit getAxisHint () const; inline DbU::Unit getAxisHistory () const; - inline long getAxisWeight ( DbU::Unit ) const; + inline DbU::Unit getAxisWeight ( DbU::Unit ) const; inline const Interval& getConstraints () const; inline const Interval& getOptimal () const; inline const Interval& getPerpandicularFree () const; @@ -218,7 +218,7 @@ namespace Katana { //inline const vector& RoutingEvent::getPerpandiculars () const { return _perpandiculars; } inline DbU::Unit RoutingEvent::getAxisHistory () const { return _axisHistory; } inline DbU::Unit RoutingEvent::getAxisHint () const { return _axisHint; } - inline long RoutingEvent::getAxisWeight ( DbU::Unit axis ) const { return abs(axis - getAxisHint()); } + inline DbU::Unit RoutingEvent::getAxisWeight ( DbU::Unit axis ) const { return abs(axis - getAxisHint()); } inline const Interval& RoutingEvent::getConstraints () const { return _constraints; } inline const Interval& RoutingEvent::getOptimal () const { return _optimal; } inline const Interval& RoutingEvent::getPerpandicularFree () const { return _dataNegociate->getPerpandicularFree(); } diff --git a/katana/src/katana/TrackCost.h b/katana/src/katana/TrackCost.h index 95d95336..32245001 100644 --- a/katana/src/katana/TrackCost.h +++ b/katana/src/katana/TrackCost.h @@ -119,7 +119,7 @@ namespace Katana { inline DbU::Unit getDelta () const; inline DbU::Unit getDeltaPerpand () const; inline DbU::Unit getLongestOverlap () const; - inline long getAxisWeight () const; + inline DbU::Unit getAxisWeight () const; inline int getRipupCount () const; inline uint32_t getDataState () const; inline uint32_t setFlags ( uint32_t ); @@ -203,7 +203,7 @@ namespace Katana { inline uint32_t TrackCost::getTerminals () const { return _terminals; } inline DbU::Unit TrackCost::getLongestOverlap () const { return _longuestOverlap; } inline DbU::Unit TrackCost::getDelta () const { return _delta; } - inline long TrackCost::getAxisWeight () const { return _axisWeight; } + inline DbU::Unit TrackCost::getAxisWeight () const { return _axisWeight; } inline int TrackCost::getRipupCount () const { return _ripupCount; } inline uint32_t TrackCost::getDataState () const { return _dataState; } inline uint32_t TrackCost::setFlags ( uint32_t mask ) { _flags |= mask; return _flags; } diff --git a/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h b/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h index 34f512af..090da95b 100644 --- a/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h +++ b/vlsisapd/src/configuration/src/vlsisapd/configuration/Parameter.h @@ -204,7 +204,7 @@ namespace Cfg { inline void Parameter::registerCb ( void* tag, ParameterChangedCb_t cb ) { - _callbacks.push_back(make_pair(tag,cb)); cb(this); + _callbacks.push_back(std::make_pair(tag,cb)); cb(this); } inline void Parameter::unregisterCb ( void* tag ) From 8ee0f3c4f7e928b778a5c5883b29dd8eb966df90 Mon Sep 17 00:00:00 2001 From: Roselyne Chotin-Avot Date: Fri, 10 Aug 2018 14:39:53 +0200 Subject: [PATCH 4/4] Change Stratus documentation to reST --- bootstrap/Makefile.package | 4 - bootstrap/builder/Builder.py | 4 - documentation/CMakeLists.txt | 19 +- documentation/Contents.rst | 4 +- documentation/DpGen/DpGen.rst | 11 - documentation/Patterns/Patterns.rst | 11 - documentation/Stratus/Developper.rst | 318 ++ documentation/Stratus/DpGen.rst | 3543 ++++++++++++++++++++ documentation/Stratus/Language.rst | 2799 ++++++++++++++++ documentation/Stratus/Pattern.rst | 260 ++ documentation/Stratus/Stratus.rst | 11 - documentation/Stratus/images/Makefile.am | 11 + documentation/Stratus/images/add1.png | Bin 0 -> 5500 bytes documentation/Stratus/images/add2.png | Bin 0 -> 15347 bytes documentation/Stratus/images/addaccu.png | Bin 0 -> 111942 bytes documentation/Stratus/images/editor.png | Bin 0 -> 43831 bytes documentation/Stratus/images/resizeAb.png | Bin 0 -> 949 bytes documentation/Stratus/images/test.png | Bin 0 -> 23992 bytes documentation/Stratus/images/xml.png | Bin 0 -> 44214 bytes documentation/Stratus/index.rst | 20 + documentation/Stratus/pdfHeader.rst | 15 + documentation/_templates/indexcontent.html | 4 - documentation/conf.py | 1 + documentation/index.rst | 4 +- stratus1/CMakeLists.txt | 14 +- stratus1/configure.in | 12 +- 26 files changed, 6998 insertions(+), 67 deletions(-) delete mode 100644 documentation/DpGen/DpGen.rst delete mode 100644 documentation/Patterns/Patterns.rst create mode 100644 documentation/Stratus/Developper.rst create mode 100644 documentation/Stratus/DpGen.rst create mode 100644 documentation/Stratus/Language.rst create mode 100644 documentation/Stratus/Pattern.rst delete mode 100644 documentation/Stratus/Stratus.rst create mode 100644 documentation/Stratus/images/Makefile.am create mode 100644 documentation/Stratus/images/add1.png create mode 100644 documentation/Stratus/images/add2.png create mode 100644 documentation/Stratus/images/addaccu.png create mode 100644 documentation/Stratus/images/editor.png create mode 100644 documentation/Stratus/images/resizeAb.png create mode 100644 documentation/Stratus/images/test.png create mode 100644 documentation/Stratus/images/xml.png create mode 100644 documentation/Stratus/index.rst create mode 100644 documentation/Stratus/pdfHeader.rst diff --git a/bootstrap/Makefile.package b/bootstrap/Makefile.package index 4fced53e..403a900e 100644 --- a/bootstrap/Makefile.package +++ b/bootstrap/Makefile.package @@ -73,10 +73,6 @@ install: FORCE cd build.dir/$$tool; \ makeArgs=""; \ cmakeArgs="$$commonCMakeArgs -D BUILD_DOC:STRING=OFF"; \ - if [ "$$tool" = "stratus1" ]; then \ - makeArgs="dvi safepdf html"; \ - cmakeArgs="$$commonCMakeArgs -D BUILD_DOC:STRING=ON"; \ - fi; \ if [ "$$tool" = "hurricane" \ -o "$$tool" = "crlcore" \ -o "$$tool" = "unicorn" ]; then \ diff --git a/bootstrap/builder/Builder.py b/bootstrap/builder/Builder.py index b75911f3..30928db2 100644 --- a/bootstrap/builder/Builder.py +++ b/bootstrap/builder/Builder.py @@ -214,10 +214,6 @@ class Builder: if self._ninja: command = [ "ninja-build" ] #command += [ "DESTDIR=%s" % self.installDir ] - if self._enableDoc == "ON": - #if tool.name == "crlcore" or tool.name == "stratus1": - if tool.name == "stratus1": - command += [ "dvi", "safepdf", "html" ] command += self._makeArguments print "Make/Ninja command:", command sys.stdout.flush () diff --git a/documentation/CMakeLists.txt b/documentation/CMakeLists.txt index a3ced41c..2bee67c7 100644 --- a/documentation/CMakeLists.txt +++ b/documentation/CMakeLists.txt @@ -42,6 +42,12 @@ set ( rdsRst RDS/pdfHeader.rst RDS/RDSpage.rst ) + + set (stratusRst Stratus/pdfHeader.rst + Stratus/Developper.rst + Stratus/Language.rst + Stratus/DpGen.rst + Stratus/Patterns.rst ) add_custom_target ( doc_HTML ALL cd ${DOCUMENTATION_SOURCE_DIR} @@ -53,15 +59,13 @@ ../_static/SoC-ReST.css ../_static/pygments.css CrlCore/CrlCore.rst - DpGen/DpGen.rst Hurricane/Hurricane.rst - Patterns/Patterns.rst - Stratus/Stratus.rst Unicorn/Unicorn.rst Viewer/Viewer.rst ${usersGuideRst} UsersGuide/index.rst ${pythonCppRst} PythonCpp/index.rst ${rdsRst} RDS/index.rst + ${stratusRst} stratus/index.rst ) add_custom_target ( pdf_UsersGuide ALL @@ -86,10 +90,19 @@ add_dependencies ( pdf_RDS ../etc/definitions.rst ../etc/SoC-ReST.tex ${pythonCppRst} ) + + add_custom_target ( pdf_Stratus ALL + cd ${DOCUMENTATION_SOURCE_DIR}/Stratus + && ../etc/doPdf.sh ${stratusRst} Stratus.rst + ) + add_dependencies ( pdf_Stratus ../etc/definitions.rst + ../etc/SoC-ReST.tex + ${StratusRst} ) install ( DIRECTORY _build/html/ DESTINATION ${htmlInstallDir} ) install ( FILES RDS/RDS.pdf PythonCpp/PythonCpp.pdf + Stratus/Stratus.pdf UsersGuide/UsersGuide.pdf DESTINATION ${pdfInstallDir} ) endif(BUILD_DOC) diff --git a/documentation/Contents.rst b/documentation/Contents.rst index febd0e88..670fd7fd 100644 --- a/documentation/Contents.rst +++ b/documentation/Contents.rst @@ -9,9 +9,7 @@ Comprenhensive Table of Contents .. toctree:: UsersGuide/index.rst - Stratus/Stratus.rst - DpGen/DpGen.rst - Patterns/Patterns.rst + Stratus/index.rst Hurricane/Hurricane.rst Viewer/Viewer.rst CrlCore/CrlCore.rst diff --git a/documentation/DpGen/DpGen.rst b/documentation/DpGen/DpGen.rst deleted file mode 100644 index 0d8324d1..00000000 --- a/documentation/DpGen/DpGen.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. -*- Mode: rst -*- - -.. include:: ../etc/definitions.rst - - -================= -DpGen Reference -================= - -The DpGen extension of the Stratus Language reference is generated by LaTeX2HTML_ and is -available here: `DpGen `_ diff --git a/documentation/Patterns/Patterns.rst b/documentation/Patterns/Patterns.rst deleted file mode 100644 index 66c4791c..00000000 --- a/documentation/Patterns/Patterns.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. -*- Mode: rst -*- - -.. include:: ../etc/definitions.rst - - -==================== -Patterns Reference -==================== - -The Patterns extension of the Stratus Language reference is generated by LaTeX2HTML_ and is -available here: `Patterns `_ diff --git a/documentation/Stratus/Developper.rst b/documentation/Stratus/Developper.rst new file mode 100644 index 00000000..19292e02 --- /dev/null +++ b/documentation/Stratus/Developper.rst @@ -0,0 +1,318 @@ +========================== +Stratus Developper's Guide +========================== +Sophie Belloeil + +.. toctree:: + :maxdepth: 2 + + +Class Model +=========== + +Synopsys +-------- + +:: + + class myClass ( Model ) : + ... + + exemple = myClass ( name, param ) + +Description +----------- + +Every cell made is a class herited from class ``Model``. +Some methods have to be created, like ``Interface``, ``Netlist`` ... +Some methods are inherited from the class ``Model``. + +Parameters +---------- + +- ``name`` : The name of the cell (which is the name of the files which + will be created) + +- ``param`` : A dictionnary which gives all the parameters useful in + order to create the cell + +Attributes +---------- + +- ``_name`` : Name of the cell + +- ``_st_insts`` : List of all the instances of the cell + +- ``_st_ports`` : List of all the external nets of the cell (except for + alimentations and clock) + +- ``_st_sigs`` : List of all the internal nets of the cell + +- ``_st_vdds``, ``_st_vsss`` : Two tabs of the nets which are + instancied as ``VddIn`` and ``VssIn`` + +- ``_st_cks`` : List of all the nets which are instancied as ``CkIn`` + +- ``_st_merge`` : List of all the internal nets which have to be merged + +- ``_param`` : The map given as argument at the creation of the cell + +- ``_underCells`` : List of all the instances which are cells that have + to be created + +- ``_and``, ``_or``, ``_xor``, ``_not``, ``_buff``, ``_mux``, ``_reg``, + ``_shift``, ``_comp``, ``_add``, ``_mult``, ``_div`` : tells which + generator to use when using overloard + +- ``_NB_INST`` : The number of instances of the cell (useful in order + to automatically give a name to the instances) + +- ``_TAB_NETS_OUT`` and ``_TAB_NETS_CAT`` : Lists of all the nets + automatically created + +- ``_insref`` : The reference instance (for placement) + +And, in connection with Hurricane : + +- ``_hur_cell`` : The hurricane cell (None by default) + +- ``_db`` : The database + +- ``_lib0`` : ``self._db.Get_CATA_LIB ( 0 )`` + +- ``_nb_alims_verticales``, ``_nb_pins``, ``_nb_vdd_pins``, + ``_nb_vss_pins``, ``standard_instances_list``, ``pad_north``, + ``pad_south``, ``pad_east``, ``pad_west`` : all place and route + stuffs ... + +Methods +------- + +Methods of class ``Model`` are listed below : + +- ``HurricanePlug`` : Creates the Hurricane cell thanks to the + stratus cell. + Before calling this method, only the stratus cell is created, after + this method, both cells are created. This method has to be called + before View and Save, and before Layout. + +- ``View`` : Opens/Refreshes the editor in order to see the created + layout + +- ``Quit`` : Finishes a cell without saving + +- ``Save`` : Saves the created cell + If several cells have been created, they are all going to be saved + in separated files + +Some of those methods have to be defined in order to create a new cell : + +- ``Interface`` : Description of the external ports of the cell + +- ``Netlist`` : Description of the netlist of the cell + +- ``Layout`` : Description of the layout of the cell + +- ``Vbe`` : Description of the behavior of the cell + +- ``Pattern`` : Description of the patterns in order to test the cell + +Nets +==== + +Synopsys +-------- + +:: + + netInput = LogicIn ( name, arity ) + +Description +----------- + +Instanciation of net. Differents kind of nets are listed below : + +- ``LogicIn`` : Creation of an input port + +- ``LogicOut`` : Creation of an output port + +- ``LogicInOut`` : Creation of an inout port + +- ``LogicUnknown`` : 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 +---------- + +- ``name`` : Name of the net (mandatory argument) + +- ``arity`` : Arity of the net (mandatory argument) + +- ``indice`` : For buses 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). + +Attributes +---------- + +- ``_name`` : Name of the net + +- ``_arity`` : Arity of the net (by default set to 0) + +- ``_ind`` : LSB of the net + +- ``_ext`` : Tells if the net is external or not (True/False) + +- ``_direct`` : If the net is external, tells the direction (“IN”, + “OUT”, “INOUT”, “TRISTATE”, “UNKNOWN”) + +- ``_h_type`` : If the net is an alimentation or a clock, tells the + type (“POWER”, “GROUND”, “CLOCK”) + +- ``_type`` : The arithmetic type of the net ( “nr” ) + +- ``_st_cell`` : The stratus cell which the net is instanciated in + +- ``_real_net`` : If the net is a part of a net (Sig) it is the real + net corresponding + +- ``_alias`` : [] by default. When the net has an alias, it’s a tab. + Each element of the tab correspond to a bit of the net (from the LSB + to the MSB), it’a a dictionnary : the only key is the net which this + net is an alias from, the value is the bit of the net + +- ``_to_merge`` : [] by default. The same as \_alias + +- | ``_to_cat`` : [] by default. The same as \_alias + +And, in connection with Hurricane : + +- ``_hur_net`` : A tab with all the hurricane nets corresponding to the + stratus net ; From the LSB to the MSB (for example, with a 1 bit net, + one gets the hurricane net by doing : ``net._hur_net[0]`` ). + +Methods +------- + +- ``Buffer`` : Instanciation of a Buffer + +- ``Shift`` : Instanciation of a shifter + +- ``Mux`` : Instanciation of a multiplexor + +- ``Reg`` : Instanciation of a register + +- ``Eq/Ne`` : Instanciation of comparison generator + +- ``Extend`` : A net is extended + +- ``Alias`` : A net is an alias of another net + +- | ``Delete`` : Deletion of the Hurricane nets + +And the overloards : + +- \_\_init\_\_ : Initialisation of nets + +- \_\_le\_\_ : initialisation of a net thanks to <= notation + +- \_\_getitem\_\_, \_\_geslice\_\_ : Creation of “Sig” nets : which are + part of nets (use of ``[]`` and ``[:]``) + +- \_\_and\_\_, \_\_or\_\_, \_\_xor\_\_, \_\_invert\_\_ : boolean + operation with &, \|, ^ ,   + +- \_\_add\_\_, \_\_mul\_\_, \_\_div\_\_ : arithmetic operators with +, + \* and / + +Instances +========= + +Synopsys +-------- + +:: + + Inst ( model + , name + , param = myParam + , map = myMap + ) + +Description +----------- + +Instantiation of an instance. The type of the instance is given by the +``model`` parameter. The connexions are made thanks to the ``map`` +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. + +- ``param`` : Dictionnary for parameters of the mastercell (optional : + only for mastercells which require it) + +- ``map`` : Dictionnary for connexions in order to make the netlist + +Attributes +---------- + +- ``_name`` : Name of the instance (the name given as parameter if + there’s one, a name created otherwise) + +- ``_model`` : Name of the model given as argument + +- ``_real_model`` : Name of the model created thanks to ``_model`` and + all the parameters + +- ``_map`` : Dictionnary ``map`` given at the instanciation + +- ``_param`` : Dictionnary ``param`` given at the instanciation + +- ``_st_cell`` : The stratus cell which the instance is instanciated in + +- ``_st_masterCell`` : The stratus master cell of the instance + +For placement : + +- ``_plac`` : tells if the instance is placed or not (UNPLACED by + default) + +- ``_x``, ``_y`` : the coordinates of the instance (only for placed + instances) + +- ``_sym`` : the symetry of the instance (only for placed instances) + +And, in connection with Hurricane : + +- ``_hur_instance`` : The hurricane instance (None by default) + +- ``_hur_masterCell`` : The Hurricane master cell of the instance (None + by default) + +Methods +------- + +- Delete : Deletion of the Hurricane instance + + diff --git a/documentation/Stratus/DpGen.rst b/documentation/Stratus/DpGen.rst new file mode 100644 index 00000000..3fbc30be --- /dev/null +++ b/documentation/Stratus/DpGen.rst @@ -0,0 +1,3543 @@ +======================= +DpGen generators manual +======================= +Sophie Belloeil + +.. toctree:: + :maxdepth: 2 + + +DpgenInv +======== + +- **Name** : DpgenInv – Inverter Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenInv', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits inverter with an output + power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1, 2, 4 or 8 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 ) + +- **Example** : + + :: + + from stratus import * + + class inst_inv ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 54 ) + self.o = SignalOut ( "o", 54 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenInv', 'inv_54' + , param = { 'nbit' : 54 + , 'physical' : True + } + ) + self.I = Inst ( 'inv_54', 'inst' + , map = { 'i0' : self.i + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenBuff +========= + +- **Name** : DpgenBuff – Buffer Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenBuff', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits inverter with an output + power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2, 4 or 8 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 + +- **Example** : + + :: + + from stratus import * + + class inst_buff ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 32 ) + self.o = SignalOut ( "o", 32 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenBuff', 'buff_32' + , param = { 'nbit' : 32 + , 'physical' : True + } + ) + self.I = Inst ( 'buff_32', 'inst' + , map = { 'i0' : self.i + , 'q' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNand2 +========== + +- **Name** : DpgenNand2 – Nand2 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNand2', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs NAND with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 and i1 ) + +- **Example** : + + :: + + from stratus import * + + class inst_nand2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNand2', 'nand2_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'nand2_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNand3 +========== + +- **Name** : DpgenNand3 – Nand3 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNand3', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits three inputs NAND with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 and i1 and i2 ) + +- **Example** : + + :: + + from stratus import * + + class inst_nand3 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 20 ) + self.in2 = SignalIn ( "in2", 20 ) + self.in3 = SignalIn ( "in3", 20 ) + self.o = SignalOut ( "o", 20 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNand3', 'nand3_20' + , param = { 'nbit' : 20 + , 'physical' : True + } + ) + self.I = Inst ( 'nand3_20', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +Dpgennand4 +========== + +- **Name** : DpgenNand4 – Nand4 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNand4', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits four inputs NAND with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **i3** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 and i1 and i2 and i3 ) + +- **Example** : + + :: + + from stratus import * + + class inst_nand4 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 9 ) + self.in2 = SignalIn ( "in2", 9 ) + self.in3 = SignalIn ( "in3", 9 ) + self.in4 = SignalIn ( "in4", 9 ) + self.o = SignalOut ( "o", 9 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNand4', 'nand4_9' + , param = { 'nbit' : 9 + , 'physical' : True + } + ) + self.I = Inst ( 'nand4_9', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'i3' : self.in4 + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenAnd2 +========= + +- **Name** : DpgenAnd2 – And2 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenAnd2', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs AND with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 and i1 + +- **Example** : + + :: + + from stratus import * + + class inst_and2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.out = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenAnd2', 'and2_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'and2_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'q' : self.out + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenAnd3 +========= + +- **Name** : DpgenAnd3 – And3 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenAnd3', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits three inputs AND with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional): Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False): In order to + generate a layout + + - **behavioral** (optional, default value : False): In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 and i1 and i2 + +- **Example** : + + :: + + from stratus import * + + class inst_and3 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 16 ) + self.in2 = SignalIn ( "in2", 16 ) + self.in3 = SignalIn ( "in3", 16 ) + self.out = SignalOut ( "o", 16 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenAnd3', "and3_16" + , param = { 'nbit' : 16 + , 'physical' : True + } + ) + self.I = Inst ( 'and3_16', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'q' : self.out + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref (0, 0) ) + +DpgenAnd4 +========= + +- **Name** : DpgenAnd4 – And4 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenAnd4', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits four inputs AND with an + output power of ``d`` named ``modelname``. + +- Terminal Names : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **i3** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 and i1 and i2 and i3 + +- **Example** : + + :: + + from stratus import * + + class inst_and4 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 2 ) + self.in2 = SignalIn ( "in2", 2 ) + self.in3 = SignalIn ( "in3", 2 ) + self.in4 = SignalIn ( "in4", 2 ) + self.out = SignalOut ( "o", 2 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenAnd4', 'and4_2' + , param = { 'nbit' : 2 + , 'physical' : True + } + ) + self.I = Inst ( 'and4_2', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'i3' : self.in4 + , 'q' : self.out + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNor2 +========= + +- **Name** : DpgenNor2 – Nor2 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNor2', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs NOR with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 or i1 ) + +- **Example** : + + :: + + from stratus import * + + class inst_nor2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNor2', 'nor2_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'nor2_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNor3 +========= + +- **Name** : DpgenNor3 – Nor3 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNor3', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits three inputs NOR with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 or i1 or i2 ) + +- **Example** : + + :: + + from stratus import * + + class inst_nor3 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 3 ) + self.in2 = SignalIn ( "in2", 3 ) + self.in3 = SignalIn ( "in3", 3 ) + self.o = SignalOut ( "out", 3 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNor3', 'nor3_3' + , param = { 'nbit' : 3 + , 'physical' : True + } + ) + self.I = Inst ( 'nor3_3', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNor4 +========= + +- **Name** : DpgenNor4 – Nor4 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNor4', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits four inputs NOR with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **i3** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 or i1 or i2 or i3 ) + +- **Example** : + + :: + + from stratus import * + + class inst_nor4 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 15 ) + self.in2 = SignalIn ( "in2", 15 ) + self.in3 = SignalIn ( "in3", 15 ) + self.in4 = SignalIn ( "in4", 15 ) + self.out = SignalOut ( "o", 15 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNor4', 'nor4_15' + , param = { 'nbit' : 15 + , 'physical' : True + } + ) + self.I = Inst ( 'nor4_15', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'i3' : self.in4 + , 'nq' : self.out + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenOr2 +======== + +- **Name** : DpgenOr2 – Or2 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenOr2', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs OR with an output + power of ``drive`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the a map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, the ``drive`` is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 or i1 + +- **Example** : + + :: + + from stratus import * + + class inst_or2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenOr2', 'or2_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'or2_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'q' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenOr3 +======== + +- **Name** : DpgenOr3 – Or3 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenOr3', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits three inputs OR with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 or i1 or i2 + +- **Example** : + + :: + + from stratus import * + + class inst_or3 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 5 ) + self.in2 = SignalIn ( "in2", 5 ) + self.in3 = SignalIn ( "in3", 5 ) + self.o = SignalOut ( "o", 5 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenOr3', 'or3_5' + , param = { 'nbit' : 5 + , 'physical' : True + } + ) + self.I = Inst ( 'or3_5', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'q' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenOr4 +======== + +- **Name** : DpgenOr4 – Or4 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenOr4', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits four inputs OR with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **i2** : input (``n`` bits) + + - **i3** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 or i1 or i2 or i3 + +- **Example** : + + :: + + from stratus import * + + class inst_or4 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 16 ) + self.in2 = SignalIn ( "in2", 16 ) + self.in3 = SignalIn ( "in3", 16 ) + self.in4 = SignalIn ( "in4", 16 ) + self.out = SignalOut ( "o", 16 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenOr4', 'or4_16' + , param = { 'nbit' : 16 + , 'physical' : True + } + ) + self.I = Inst ( 'or4_16', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'i2' : self.in3 + , 'i3' : self.in4 + , 'q' : self.out + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenXor2 +========= + +- **Name** : DpgenXor2 – Xor2 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenXor2', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs XOR with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optionnal, default value : False) : In order to + generate a layout + + - **behavioral** (optionnal, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= i0 xor i1 + +- **Example** : + + :: + + from stratus import * + + class inst_xor2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenXor2', 'xor2_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'xor2_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'q' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenXnor2 +========== + +- **Name** : DpgenXnor2 – Xnor2 Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenXnor2', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs XNOR with an + output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **i0** : input (``n`` bits) + + - **i1** : input (``n`` bits) + + - **nq** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 1 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= not ( i0 xor i1 ) + +- **Example** : + + :: + + from stratus import * + + class inst_xnor2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenXnor2', 'xnor2_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'xnor2_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNmux2 +========== + +- **Name** : DpgenNmux2 – Multiplexer Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNmux2', modelname + , param = { 'nbit' : n + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs multiplexer named + ``modelname``. + +- **Terminal Names** : + + - **cmd** : select ( 1 bit ) + + - **i0** : input ( ``n`` bits ) + + - **i1** : input ( ``n`` bits ) + + - **nq** : output ( ``n`` bits ) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= WITH cmd SELECT not i0 WHEN '0', + not i1 WHEN '1'; + +- **Example** : + + :: + + from stratus import * + + class inst_nmux2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 5 ) + self.in2 = SignalIn ( "in2", 5 ) + self.cmd = SignalIn ( "cmd", 1 ) + self.o = SignalOut ( "o", 5 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNmux2', 'nmux2_5' + , param = { 'nbit' : 5 + , 'physical' : True + } + ) + self.I = Inst ( 'nmux2_5', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'cmd' : self.cmd + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenMux2 +========= + +- **Name** : DpgenMux2 – Multiplexer Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenMux2', modelname + , param = { 'nbit' : n + , 'drive' : d + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits two inputs multiplexer with + an output power of ``d`` named ``modelname``. + +- **Terminal Names** : + + - **cmd** : select ( 1 bit ) + + - **i0** : input ( ``n`` bits ) + + - **i1** : input ( ``n`` bits ) + + - **q** : output ( ``n`` bits ) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **nbit\_cmd** (mandatory) : Defines the size of the generator + + - **drive** (optional) : Defines the output power of the gates + + - Valid drive are : 2 or 4 + + - If this parameter is not defined, it’s value is the smallest + one permitted + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nq <= WITH cmd SELECT i0 WHEN '0', + i1 WHEN '1'; + +- **Example** : + + :: + + from stratus import * + + class inst_mux2 ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.cmd = SignalIn ( "cmd", 1 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenMux2', 'mux2_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'mux2_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'cmd' : self.cmd + , 'q' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNbuse +========== + +- **Name** : DpgenNbuse – Tristate Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNbuse', modelname + , param = { 'nbit' : n + , 'physical' : true + , 'behavioral' : true + } + ) + +- **Description** : Generates a ``n`` bits tristate with an + complemented output named ``modelname``. + +- **Terminal Names** : + + - **cmd** : select ( 1 bit ) + + - **i0** : input ( ``n`` bits ) + + - **nq** : output ( ``n`` bits ) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nts:BLOCK(cmd = '1') BEGIN + nq <= GUARDED not(i0); + END + +- **Example** : + + :: + + from stratus import * + + class inst_nbuse ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 29 ) + self.cmd = SignalIn ( "cmd", 1 ) + self.o = SignalOut ( "o", 29 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNbuse', 'nbuse29' + , param = { 'nbit' : 29 + , 'physical' : True + } + ) + self.I = Inst ( 'nbuse29', 'inst' + , map = { 'i0' : self.i + , 'cmd' : self.cmd + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenBuse +========= + +- **Name** : DpgenBuse – Tristate Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenBuse', modelname + , param = { 'nbit' : n + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits tristate named + ``modelname``. + +- **Terminal Names** : + + - **cmd** : select ( 1 bit ) + + - **i0** : input ( ``n`` bits ) + + - **q** : output ( ``n`` bits ) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + nts:BLOCK(cmd = '1') BEGIN + q <= GUARDED i0; + END + +- **Example** : + + :: + + from stratus import * + + class inst_buse ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 8 ) + self.cmd = SignalIn ( "cmd", 1 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenBuse', 'buse_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'buse_8', 'inst' + , map = { 'i0' : self.i + , 'cmd' : self.cmd + , 'q' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNand2mask +============== + +- **Name** : DpgenNand2mask – Programmable Mask Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNand2mask', modelname + , param = { 'nbit' : n + , 'const' : constVal + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits conditionnal NAND mask named + ``modelname``. + +- **Terminal Names** : + + - **cmd** : mask control ( 1 bit ) + + - **i0** : input ( ``n`` bits ) + + - **nq** : output ( ``n`` bits ) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **const** (mandatory) : Defines the constant (string beginning + with 0b, 0x or 0o functions of the basis) + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - If the ``cmd`` signal is set to ``zero``, the mask is NOT applied, + so the whole operator behaves like an inverter. + + - If the ``cmd`` signal is set to ``one``, the mask is applied, the + output is the *complemented* result of the input value *ANDed* + with the mask (suplied by ``constVal``). + + - The constant ``constVal`` is given to the macro-generator call, + therefore the value cannot be changed afterward : it’s hard wired + in the operator. + + - A common error is to give a real constant for the ``constVal`` + argument. Be aware that it is a character string. + +- **Behavior** : + + :: + + nq <= WITH cmd SELECT not(i0) WHEN '0', + not(i0 and constVal) WHEN '1'; + +- **Example** : + + :: + + from stratus import * + + class inst_nand2mask ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 32 ) + self.cmd = SignalIn ( "cmd", 1 ) + self.o = SignalOut ( "o", 32 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNand2mask', 'nand2mask_0x0000ffff' + , param = { 'nbit' : 32 + , 'const' : "0x0000FFFF" + , 'physical' : True + } + ) + self.I = Inst ( 'nand2mask_0x0000ffff', 'inst' + , map = { 'i0' : self.i + , 'cmd' : self.cmd + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNor2mask +============= + +- **Name** : DpgenNor2mask – Programmable Mask Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNor2mask', modelname + , param = { 'nbit' : n + , 'const' : constVal + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits conditionnal NOR mask named + ``modelname``. + +- **Terminal Names** : + + - **cmd** : mask control ( 1 bit ) + + - **i0** : input ( ``n`` bits ) + + - **nq** : output ( ``n`` bits ) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **const** (mandatory) : Defines the constant (string beginning + with 0b, 0x or 0o functions of the basis) + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - If the ``cmd`` signal is set to ``zero``, the mask is NOT applied, + so the whole operator behaves like an inverter. + + - If the ``cmd`` signal is set to ``one``, the mask is applied, the + output is the *complemented* result of the input value *ORed* with + the mask (suplied by ``constVal``). + + - The constant ``constVal`` is given to the macro-generator call, + therefore the value cannot be changed afterward : it’s hard wired + in the operator. + + - A common error is to give a real constant for the ``constVal`` + argument. Be aware that it is a character string. + +- **Behavior** : + + :: + + nq <= WITH cmd SELECT not(i0) WHEN '0', + not(i0 or constVal) WHEN '1'; + +- **Example** : + + :: + + from stratus import * + + class inst_nor2mask ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 8 ) + self.cmd = SignalIn ( "cmd", 1 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNor2mask', 'nor2mask_000111' + , param = { 'nbit' : 8 + , 'const' : "0b000111" + , 'physical' : True + } + ) + self.I = Inst ( 'nor2mask_000111', 'inst' + , map = { 'i0' : self.i + , 'cmd' : self.cmd + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenXnor2mask +============== + +- **Name** : DpgenXnor2mask – Programmable Mask Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenXnor2mask', modelname + , param = { 'nbit' : n + , 'const' : constVal + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits conditionnal XNOR mask named + ``modelname``. + +- **Terminal Names** : + + - **cmd** : mask control ( 1 bit ) + + - **i0** : input ( ``n`` bits ) + + - **nq** : output ( ``n`` bits ) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **const** (mandatory) : Defines the constant (string beginning + with 0b, 0x or 0o functions of the basis) + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - If the ``cmd`` signal is set to ``zero``, the mask is NOT applied, + so the whole operator behaves like an inverter. + + - If the ``cmd`` signal is set to ``one``, the mask is applied, the + output is the *complemented* result of the input value *XORed* + with the mask (suplied by ``constVal``). + + - The constant ``constVal`` is given to the macro-generator call, + therefore the value cannot be changed afterward : it’s hard wired + in the operator. + + - A common error is to give a real constant for the ``constVal`` + argument. Be aware that it is a character string. + +- **Behavior** : + + :: + + nq <= WITH cmd SELECT not(i0) WHEN '0', + not(i0 xor constVal) WHEN '1'; + +- **Example** : + + :: + + from stratus import * + + class inst_xnor2mask ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 8 ) + self.cmd = SignalIn ( "cmd", 1 ) + self.o = SignalOut ( "o", 8 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenXnor2mask', 'xnor2mask_0b000111' + , param = { 'nbit' : 8 + , 'const' : "0b000111" + , 'physical' : True + } + ) + self.I = Inst ( 'xnor2mask_0b000111', 'inst' + , map = { 'i0' : self.i + , 'cmd' : self.cmd + , 'nq' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenAdsb2f +=========== + +- **Name** : DpgenAdsb2f – Adder/Substractor Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenAdsb2f', modelname + , param = { 'nbit' : n + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits adder/substractor named + ``modelname``. + +- **Terminal Names** : + + - **i0** : First operand (input, ``n`` bits) + + - **i1** : Second operand (input, ``n`` bits) + + - **q** : Output operand (ouput, ``n`` bits) + + - **add\_sub** : Select addition or substraction (input, 1 bit) + + - **c31** : Sarry out. In unsigned mode, this is the overflow + (output, 1 bit) + + - **c30** : Used to compute overflow in signed mode : + ``overflow = c31 xor c30`` (output, 1 bit) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - If the ``add_sub`` signal is set to ``zero``, an addition is + performed, otherwise it’s a substraction. + + - Operation can be either signed or unsigned. In unsigned mode + ``c31`` is the overflow ; in signed mode you have to compute + overflow by *XORing* ``c31`` and ``c30`` + +- **Example** : + + :: + + from stratus import * + + class inst_ADSB2F ( Model ) : + + def Interface ( self ) : + self.in1 = SignalIn ( "in1", 8 ) + self.in2 = SignalIn ( "in2", 8 ) + self.out = SignalOut ( "o", 8 ) + self.as = SignalIn ( "as", 1 ) + self.c0 = SignalOut ( "c0", 1 ) + self.c1 = SignalOut ( "c1", 1 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenAdsb2f', 'adder_8' + , param = { 'nbit' : 8 + , 'physical' : True + } + ) + self.I = Inst ( 'adder_8', 'inst' + , map = { 'i0' : self.in1 + , 'i1' : self.in2 + , 'add_sub' : self.as + , 'q' : self.out + , 'c30' : self.c0 + , 'c31' : self.c1 + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenShift +========== + +- **Name** : DpgenShift – Shifter Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenShift', modelname + , param = { 'nbit' : n + , 'physical' : True + } + ) + +- **Description** : Generates a ``n`` bits shifter named ``modelname``. + +- **Terminal Names** : + + - **op** : select the kind of shift (input, 2 bits) + + - **shamt** : the shift amount (input, ``Y`` bits) + + - **i** : value to shift (input, ``n`` bits) + + - **o** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **How it works** : + + - If the ``op[0]`` signal is set to ``one``, performs a right shift, + performs a left shift otherwise. + + - If the ``op[1]`` signal is set to ``one``, performs an arithmetic + shift (only meaningful in case of a right shift). + + - shamt : specifies the shift amount. The width of this signal + (``Y``) is computed from the operator’s width : ``Y = ceil(log2(n))`` - 1 + +- **Example** : + + :: + + from stratus import * + + class inst_shifter ( Model ) : + + def Interface ( self ) : + self.instop = SignalIn ( "instop", 2 ) + self.instshamt = SignalIn ( "instshamt", 2 ) + self.insti = SignalIn ( "insti", 4 ) + self.insto = SignalOut ( "insto", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenShifter', 'shifter_4' + , param = { 'nbit' : 4 + , 'physical' : True + } + ) + self.I = Inst ( 'shifter_4', 'inst' + , map = { 'op' : self.instop + , 'shamt' : self.instshamt + , 'i' : self.insti + , 'o' : self.insto + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenShrot +========== + +- **Name** : DpgenShrot – Shift/Rotation Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenShrot', modelname + , param = { 'nbit' : n + , 'physical' : True + } + ) + +- **Description** : Generates a ``n`` bits shift/rotation operator + named ``modelname``. + +- **Terminal Names** : + + - **op** : select the kind of shift/rotation (input, 3 bits) + + - **shamt** : the shift amount (input, ``Y`` bits) + + - **i** : value to shift (input, ``n`` bits) + + - **o** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **How it works** : + + - If the ``op[0]`` signal is set to ``one``, performs a right + shift/rotation , otherwise left shift/rotation occurs. + + - If the ``op[1]`` signal is set to ``one``, performs an arithmetic + shift (only meaningful in case of a right shift). + + - If the ``op[2]`` signal is set to ``one``, performs a rotation, + otherwise performs a shift.. + + - ``shamt`` specifies the shift amount. The width of this signal + (``Y``) is computed from the operator’s width : + ``Y = ceil(log2(n))`` - 1 + +- **Example** : + + :: + + from stratus import * + + class inst_shrot ( Model ) : + + def Interface ( self ) : + self.rotop = SignalIn ( "rotop", 3 ) + self.instshamt = SignalIn ( "instshamt", 2 ) + self.insti = SignalIn ( "insti", 4 ) + self.insto = SignalOut ( "insto", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenShrot', 'shrot_4' + , param = { 'nbit' : 4 + , 'physical' : True + } + ) + self.I = Inst ( 'shrot_4', 'inst' + , map = { 'op' : self.rotop + , 'shamt' : self.instshamt + , 'i' : self.insti + , 'o' : self.insto + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenNul +======== + +- **Name** : DpgenNul – Zero Detector Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenNul', modelname + , param = { 'nbit' : n + , 'physical' : True + } + ) + +- **Description** : Generates a ``n`` bits zero detector named + ``modelname``. + +- **Terminal Names** : + + - **i0** : value to check (input, ``n`` bits) + + - **q** : null flag (1 bit) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **Behavior** : + + :: + + q <= '1' WHEN ( i0 = X"00000000" ) ELSE '0'; + +- **Example** : + + :: + + from stratus import * + + class inst_nul ( Model ) : + + def Interface ( self ) : + self.i = SignalIn ( "i", 4 ) + self.o = SignalOut ( "o", 1 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenNul', 'nul_4' + , param = { 'nbit' : 4 + , 'physical' : True + } + ) + self.I = Inst ( 'nul_4', 'inst' + , map = { 'i0' : self.i + , 'nul' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenConst +========== + +- **Name** : DpgenConst – Constant Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenConst', modelname + , param = { 'nbit' : n + , 'const' : constVal + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a ``n`` bits constant named + ``modelname``. + +- **Terminal Names** : + + - **q** : the constant (output, ``n`` bit) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **const** (mandatory) : Defines the constant (string beginning + with 0b, 0x or 0o functions of the basis) + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **Behavior** : + + :: + + q <= constVal + +- **Example** : + + :: + + from stratus import * + + class inst_const ( Model ) : + + def Interface ( self ) : + self.o = SignalOut ( "o", 32 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenConst', 'const_0x0000ffff' + , param = { 'nbit' : 32 + , 'const' : "0x0000FFFF" + , 'physical' : True + } + ) + self.I = Inst ( 'const_0x0000ffff', 'inst' + , map = { 'q' : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenRom2 +========= + +- **Name** : DpgenRom2 – 2 words ROM Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenRom2', modelname + , param = { 'nbit' : n + , 'val0' : constVal0 + , 'val1' : constVal1 + , 'physical' : True + } + ) + +- **Description** : Generates a ``n`` bits 2 words optimized ROM named + ``modelname``. + +- **Terminal Names** : + + - **sel0** : address of the value (input, 1 bit) + + - **q** : the selected word (output, ``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **val0** (mandatory) : Defines the first word + + - **val1** (mandatory) : Defines the second word + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **Behavior** : + + :: + + q <= WITH sel0 SELECT + constVal0 WHEN B"0", + constVal1 WHEN B"1"; + +- **Example** : + + :: + + from stratus import * + + class inst_rom2 ( Model ) : + + def Interface ( self ) : + self.sel0 = SignalIn ( "sel0", 1 ) + self.q = SignalOut ( "dataout", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenRom2', 'rom2_0b1010_0b1100' + , param = { 'nbit' : 4 + , 'val0' : "0b1010" + , 'val1' : "0b1100" + , 'physical' : True + } + ) + self.I = Inst ( 'rom2_0b1010_0b1100', 'inst' + , map = { 'sel0' : self.sel0 + , 'q' : self.q + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenRom4 +========= + +- **Name** : DpgenRom4 – 4 words ROM Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenRom4', modelname + , param = { 'nbit' : n + , 'val0' : constVal0 + , 'val1' : constVal1 + , 'val2' : constVal2 + , 'val3' : constVal3 + , 'physical' : True + } + ) + +- **Description** : Generates a ``n`` bits 4 words optimized ROM named + ``modelname``. + +- **Terminal Names** : + + - **sel1** : upper bit of the address of the value (input, 1 bit) + + - **sel0** : lower bit of the address of the value (input, 1 bit) + + - **q** : the selected word (output, ``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **val0** (mandatory) : Defines the first word + + - **val1** (mandatory) : Defines the second word + + - **val2** (mandatory) : Defines the third word + + - **val3** (mandatory) : Defines the fourth word + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **Behavior** : + + :: + + q <= WITH sel1 & sel0 SELECT constVal0 WHEN B"00", + constVal1 WHEN B"01", + constVal2 WHEN B"10", + constVal3 WHEN B"11"; + +- **Example** : + + :: + + from stratus import * + + class inst_rom4 ( Model ) : + + def Interface ( self ) : + self.sel0 = SignalIn ( "sel0", 1 ) + self.sel1 = SignalIn ( "sel1", 1 ) + self.q = SignalOut ( "dataout", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenRom4', 'rom4_0b1010_0b1100_0b1111_0b0001' + , param = { 'nbit' : 4 + , 'val0' : "0b1010" + , 'val1' : "0b1100" + , 'val2' : "0b1111" + , 'val3' : "0b0001" + , 'physical' : True + } + ) + self.I = Inst ( 'rom4_0b1010_0b1100_0b1111_0b0001', 'inst' + , map = { 'sel0' : self.sel0 + , 'sel1' : self.sel1 + , 'q' : self.q + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenRam +======== + +- **Name** : DpgenRam – RAM Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenRam', modelname + , param = { 'nbit' : n + , 'nword' : regNumber + , 'physical' : True + } + ) + +- **Description** : Generates a RAM of ``regNumber`` words of ``n`` + bits named ``modelname``. + +- **Terminal Names** : + + - **ck** : clock signal (input, 1 bit) + + - **w** : write requested (input, 1 bit) + + - **selram** : select the write bus (input, 1 bit) + + - **ad** : the address (input, ``Y`` bits) + + - **datain** : write bus (input, ``n`` bits) + + - **dataout** : read bus (output, ``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **nword** (mandatory) : Defines the size of the words + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **Example** : + + :: + + from stratus import * + + class inst_ram ( Model ) : + + def Interface ( self ) : + self.ck = SignalIn ( "ck", 1 ) + self.w = SignalIn ( "w", 1 ) + self.selram = SignalIn ( "selram", 1 ) + self.ad = SignalIn ( "ad", 5 ) + self.datain = SignalIn ( "datain", 32 ) + self.dataout = TriState ( "dataout", 32 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenRam', 'ram_32_32' + , param = { 'nbit' : 32 + , 'nword' : 32 + , 'physical' : True + } + ) + self.I = Inst ( 'ram_32_32', 'inst' + , map = { 'ck' : self.ck + , 'w' : self.w + , 'selram' : self.selram + , 'ad' : self.ad + , 'datain' : self.datain + , 'dataout' : self.dataout + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenRf1 +======== + +- **Name** : DpgenRf1, DpgenRf1r0 – Register File Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenRf1', modelname + , param = { 'nbit' : n + , 'nword' : regNumber + , 'physical' : True + } + ) + +- **Description** : Generates a register file of ``regNumber`` words of + ``n`` bits without decoder named ``modelname``. + +- **Terminal Names** : + + - **ckok** : clock signal (input, 1 bit) + + - **sel** : select the write bus (input, 1 bit) + + - **selr** : the decoded read address (input, ``regNumber`` bits) + + - **selw** : the decoded write address (input, ``regNumber`` bits) + + - **datain0** : first write bus (input, ``n`` bits) + + - **datain1** : second write bus (input, ``n`` bits) + + - **dataout** : read bus (output, ``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the words (even, + between 2 and 64) + + - **nword** (mandatory) : Defines the number of the words (even, + between 4 and 32) + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **How it works** : + + - datain0 and datain1 are the two write busses. Only one is used to + actually write the register word, it is selected by the sel + signal. + + - When sel is set to zero datain0 is used to write the register + word, otherwise it will be datain1 + + - selr, selw : this register file have no decoder, so selr have a + bus width equal to ``regNumber``. One bit for each word + + - The DpgenRf1r0 variant differs from the DpgenRf1 in that the + register of address zero is stuck to zero. You can write into it, + it will not change the value. When read, it will always return + zero + +- **Example** : + + :: + + from stratus import * + + class inst_rf1 ( Model ) : + + def Interface ( self ) : + self.ck = SignalIn ( "ck", 1 ) + self.sel = SignalIn ( "sel", 1 ) + self.selr = SignalIn ( "selr", 16 ) + self.selw = SignalIn ( "selw", 16 ) + self.datain0 = SignalIn ( "datain0", 4 ) + self.datain1 = SignalIn ( "datain1", 4 ) + self.dataout = SignalOut ( "dataout", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenRf1', 'rf1_4_16' + , param = { 'nbit' : 4 + , 'nword' : 16 + , 'physical' : True + } + ) + self.I = Inst ( 'rf1_4_16', 'inst' + , map = { 'ck' : self.ck + , 'sel' : self.sel + , 'selr' : self.selr + , 'selw' : self.selw + , 'datain0' : self.datain0 + , 'datain1' : self.datain1 + , 'dataout' : self.dataout + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenRf1d +========= + +- **Name** : DpgenRf1d, DpgenRf1dr0 – Register File with Decoder + Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenRf1d', modelname + , param = { 'nbit' : n + , 'nword' : regNumber + , 'physical' : True + } + ) + +- **Description** : Generates a register file of ``regNumber`` words of + ``n`` bits with decoder named ``modelname``. + +- **Terminal Names** : + + - **ck** : clock signal (input, 1 bit) + + - **sel** : select the write bus (input, 1 bit) + + - **wen** : write enable (input, 1 bit) + + - **ren** : read enable (input, 1 bit) + + - **adr** : the read address (input, ``Y`` bits) + + - **adw** : the write address (input, ``Y`` bits) + + - **datain0** : first write bus (input, ``n`` bits) + + - **datain1** : second write bus (input, ``n`` bits) + + - **dataout** : read bus (output, ``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the words (even, + between 2 and 64) + + - **nword** (mandatory) : Defines the number of the words (even, + between 6 and 32) + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **How it works** : + + - datain0 and datain1 are the two write busses. Only one is used to + actually write the register word, it is selected by the sel + signal. + + - When sel is set to zero datain0 is used to write the register + word, otherwise it will be datain1 + + - adr, adw : the width (Y) of those signals is computed from + regNumber : ``Y = log2(regNumber)`` + + - wen and ren : write enable and read enable, allows reading and + writing when sets to ``one`` + + - The DpgenRf1dr0 variant differs from the DpgenRf1d in that the + register of address zero is stuck to zero. You can write into it, + it will not change the value. When read, it will always return + zero + +- **Example** : + + :: + + from stratus import * + + class inst_rf1d ( Model ) : + + def Interface ( self ) : + self.ck = SignalIn ( "ck", 1 ) + self.sel = SignalIn ( "sel", 1 ) + self.wen = SignalIn ( "wen", 1 ) + self.ren = SignalIn ( "ren", 1 ) + self.adr = SignalIn ( "adr", 4 ) + self.adw = SignalIn ( "adw", 4 ) + self.datain0 = SignalIn ( "datain0", 4 ) + self.datain1 = SignalIn ( "datain1", 4 ) + self.dataout = SignalOut ( "dataout", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenRf1d', 'rf1d_4_16' + , param = { 'nbit' : 4 + , 'nword' : 16 + , 'physical' : True + } + ) + self.I = Inst ( 'rf1d_4_16', 'inst' + , map = { 'ck' : self.ck + , 'sel' : self.sel + , 'wen' : self.wen + , 'ren' : self.ren + , 'adr' : self.adr + , 'adw' : self.adw + , 'datain0' : self.datain0 + , 'datain1' : self.datain1 + , 'dataout' : self.dataout + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenFifo +========= + +- **Name** : DpgenFifo – Fifo Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenFifo', modelname + , param = { 'nbit' : n + , 'nword' : regNumber + , 'physical' : True + } + ) + +- **Description** : Generates a FIFO of ``regNumber`` words of ``n`` + bits named ``modelname``. + +- **Terminal Names** : + + - **ck** : clock signal (input, 1 bit) + + - **reset** : reset signal (input, 1 bit) + + - **r** : read requested (input, 1 bit) + + - **w** : write requested (input, 1 bit) + + - **rok** : read acknowledge (output, 1 bit) + + - **wok** : write acknowledge (output, 1 bit) + + - **sel** : select the write bus (input, 1 bit) + + - **datain0** : first write bus (input, ``n`` bits) + + - **datain1** : second write bus (input, ``n`` bits) + + - **dataout** : read bus (output, ``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the words (even, + between 2 and 64) + + - **nword** (mandatory) : Defines the number of words (even, between + 4 and 32) + + - **physical** (optional, default value : False) : In order to + generate a layout + +- **How it works** : + + - datain0 and datain1 : the two write busses. Only one is used to + actually write the FIFO, it is selected by the sel signal. + + - sel : when set to ``zero`` the datain0 is used to write the + register word, otherwise it will be datain1. + + - r, rok : set r when a word is requested, rok tells that a word has + effectively been popped (rok == not empty). + + - w, wok : set w when a word is pushed, wok tells that the word has + effectively been pushed (wok == not full). + +- **Example** : + + :: + + from stratus import * + + class inst_fifo ( Model ) : + + def Interface ( self ) : + self.ck = SignalIn ( "ck", 1 ) + self.reset = SignalIn ( "reset", 1 ) + self.r = SignalIn ( "r", 1 ) + self.w = SignalIn ( "w", 1 ) + self.rok = SignalInOut ( "rok", 1 ) + self.wok = SignalInOut ( "wok", 1 ) + self.sel = SignalIn ( "sel", 1 ) + self.datain0 = SignalIn ( "datain0", 4 ) + self.datain1 = SignalIn ( "datain1", 4 ) + self.dataout = SignalOut ( "dataout", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenFifo', 'fifo_4_16' + , param = { 'nbit' : 4 + , 'nword' : 16 + , 'physical' : True + } + ) + self.I = Inst ( 'fifo_4_16', 'inst' + , map = { 'ck' : self.ck + , 'reset' : self.reset + , 'r' : self.r + , 'w' : self.w + , 'rok' : self.rok + , 'wok' : self.wok + , 'sel' : self.sel + , 'datain0' : self.datain0 + , 'datain1' : self.datain1 + , 'dataout' : self.dataout + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenDff +======== + +- **Name** : DpgenDff – Dynamic Flip-Flop Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenDff', modelname + , param = { 'nbit' : n + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a n bits dynamic flip-flop named + ``modelname``. The two latches of this flip-flop are dynamic, i.e. + the data is stored in a capacitor. + +- **Terminal Names** : + + - **wen** : write enable (1 bit) + + - **ck** : clock signal (1 bit) + + - **i0** : data input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - When wen is set to ``one``, enables the writing of the flip-flop + +- **Example** : + + :: + + from stratus import * + + class inst_dff ( Model ) : + + def Interface ( self ) : + self.ck = SignalIn ( "ck", 1 ) + self.wen = SignalIn ( "wen", 1 ) + self.i = SignalIn ( "i", 4 ) + self.o = SignalOut ( "o", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenDff', 'dff_4' + , param = { 'nbit' : 4 + , 'physical' : True + } + ) + self.I = Inst ( 'dff_4', 'inst' + , map = { "wen" : self.wen + , "ck" : self.ck + , "i0" : self.i + , "q" : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenDfft +========= + +- **Name** : DpgenDfft – Dynamic Flip-Flop with Scan-Path + Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenDfft', modelname + , param = { 'nbit' : n + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a n bits dynamic flip-flop with scan-path + named ``modelname``. The two latches of this flip-flop are dynamic, + i.e. the data is stored in a capacitor. + +- **Terminal Names** : + + - **scan** : scan-path mode (input, 1 bit) + + - **scin** : scan path in (input, 1 bit) + + - **wen** : write enable (1 bit) + + - **ck** : clock signal (1 bit) + + - **i0** : data input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - When scan is set to ``one``, it enables the scan-path mode. Note + that in scan-path mode, the wen signal is not effective + + - scin is the input of the scan-path. This terminal is different + from ``i0[0]``. The scout is q[N-1] (in the following example this + is ``q[31]``) + + - When wen is set to ``one`` enables the writing of the flip-flop + +- **Example** : + + :: + + from stratus import * + + class inst_dfft ( Model ) : + + def Interface ( self ) : + self.scan = SignalIn ( "scin", 1 ) + self.scin = SignalIn ( "scan", 1 ) + self.ck = SignalIn ( "ck", 1 ) + self.wen = SignalIn ( "wen", 1 ) + self.i = SignalIn ( "i", 4 ) + self.o = SignalOut ( "o", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenDfft', 'dfft_4' + , param = { 'nbit' : 4 + , 'physical' : True + } + ) + self.I = Inst ( 'dfft_4', 'inst' + , map = { "wen" : self.wen + , "ck" : self.ck + , "scan" : self.scan + , "scin" : self.scin + , "i0" : self.i + , "q" : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenSff +======== + +- **Name** : DpgenSff – Static Flip-Flop Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenSff', modelname + , param = { 'nbit' : n + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a n bits static flip-flop named + ``modelname``. The two latches of this flip-flop are static, i.e. + each one is made of two interters looped together. + +- **Terminal Names** : + + - **wen** : write enable (1 bit) + + - **ck** : clock signal (1 bit) + + - **i0** : data input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - When wen is set to ``one``, enables the writing of the flip-flop + +- **Example** : + + :: + + from stratus import * + + class inst_sff ( Model ) : + + def Interface ( self ) : + self.ck = SignalIn ( "ck", 1 ) + self.wen = SignalIn ( "wen", 1 ) + self.i = SignalIn ( "i", 4 ) + self.o = SignalOut ( "o", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenSff', 'sff_4' + , param = { 'nbit' : 4 + , 'physical' : True + } + ) + self.I = Inst ( 'sff_4', 'inst' + , map = { "wen" : self.wen + , "ck" : self.ck + , "i0" : self.i + , "q" : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + +DpgenSfft +========= + +- **Name** : DpgenSfft – Static Flip-Flop with Scan-Path + Macro-Generator + +- **Synopsys** : + + :: + + Generate ( 'DpgenSfft', modelname + , param = { 'nbit' : n + , 'physical' : True + , 'behavioral' : True + } + ) + +- **Description** : Generates a n bits static flip-flop with scan-path + named ``modelname``. The two latches of this flip-flop are static + i.e. each one is made of two interters looped togethers. + +- **Terminal Names** : + + - **scan** : scan-path mode (input, 1 bit) + + - **scin** : scan path in (input, 1 bit) + + - **wen** : write enable (1 bit) + + - **ck** : clock signal (1 bit) + + - **i0** : data input (``n`` bits) + + - **q** : output (``n`` bits) + + - **vdd** : power + + - **vss** : ground + +- **Parameters** : Parameters are given in the a map ``param``. + + - **nbit** (mandatory) : Defines the size of the generator + + - **physical** (optional, default value : False) : In order to + generate a layout + + - **behavioral** (optional, default value : False) : In order to + generate a behavior + +- **How it works** : + + - When scan is set to ``one``, it enables the scan-path mode. Note + that in scan-path mode, the wen signal is not effective + + - scin : the input of the scan-path. This terminal is different from + ``i0[0]``. The scout is ``q[N``-``1]`` (in the following example + this is ``q[3]``) + + - When wen is set to ``one``, it enables the writing of the + flip-flop + +- **Example** : + + :: + + from stratus import * + + class inst_sfft ( Model ) : + + def Interface ( self ) : + self.scan = SignalIn ( "scin", 1 ) + self.scin = SignalIn ( "scan", 1 ) + self.ck = SignalIn ( "ck", 1 ) + self.wen = SignalIn ( "wen", 1 ) + self.i = SignalIn ( "in", 4 ) + self.o = SignalOut ( "out", 4 ) + + self.vdd = VddIn ( "vdd" ) + self.vss = VssIn ( "vss" ) + + def Netlist ( self ) : + Generate ( 'DpgenSfft', 'sfft_4' + , param = { 'nbit' : 4 + , 'physical' : True + } + ) + self.I = Inst ( 'sfft_4', 'inst' + , map = { "wen" : self.wen + , "ck" : self.ck + , "scan" : self.scan + , "scin" : self.scin + , "i0" : self.i + , "q" : self.o + , 'vdd' : self.vdd + , 'vss' : self.vss + } + ) + + def Layout ( self ) : + Place ( self.I, NOSYM, Ref(0, 0) ) + + diff --git a/documentation/Stratus/Language.rst b/documentation/Stratus/Language.rst new file mode 100644 index 00000000..d23854d0 --- /dev/null +++ b/documentation/Stratus/Language.rst @@ -0,0 +1,2799 @@ +==================== +Stratus User's Guide +==================== +Sophie Belloeil + + +.. toctree:: + :maxdepth: 2 + +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. + +- ``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 diff --git a/documentation/Stratus/Pattern.rst b/documentation/Stratus/Pattern.rst new file mode 100644 index 00000000..c5c1d4a1 --- /dev/null +++ b/documentation/Stratus/Pattern.rst @@ -0,0 +1,260 @@ +============================ +Patterns module User's Guide +============================ +Roselyne Chotin-Avot + +.. toctree:: + :maxdepth: 2 + + +Description +=========== + +The patterns module of *Stratus* is a set of *Python* classes and +methods that allows a procedural description of input pattern file for +the logic simulator. The *Stratus* ``Pattern`` method produces a pattern +description file as output. The file generated by ``Pattern`` method is +in pat format, so IT IS STRONGLY RECOMMENDED TO SEE pat(5) manual BEFORE +TO USE IT. + +Syntax +====== + +From a user point of view, ``Pattern`` method is a pattern description +language using all standard *Python* facilities. Here follows the +description of the ``Pattern`` method. +A pat format file can be divided in two parts : declaration and +description part. +The declaration part is the list of inputs, outputs, internal signals +and registers. Inputs are to be forced to a certain value and all the +others are to be observed during simulation. +The description part is a set of patterns, where each pattern defines +the value of inputs and outputs. The pattern number represents actually +the absolute time for the simulator. +Similarly, a ``Pattern`` method can be divided in two parts : +declaration and description part. Methods related to the declaration +must be called before any function related to the description part. + +Declaration part +---------------- + +The first thing you should do in this part is to instantiate the class +``Patwrite`` to have access to all patterns declaration and description +methods. The constructor of this class take as parameters the name of +pattern output file and the *Stratus* cell that is described (see +``PatWrite`` [patwrite]). +Then, this part allows you to declare the inputs, the outputs, and +internal observing points (see ``declar``\ [declar] and +``declar_interface`` [declar:sub:`i`\ nterface]). + +Description part +---------------- + +After all signals are declared, you can begin the description part (see +``pattern_begin`` [pattern:sub:`b`\ egin]). In this part you have to +define input values which are to be applied to the inputs of the circuit +or output values which are to be compare with the values produced during +the simulation. (see ``affect`` [affect], ``affect_any`` +[affect:sub:`a`\ ny], ``affect_int`` [affect:sub:`i`\ nt] and +``affect_fix`` [affect:sub:`f`\ ix]). ``Pattern`` method describes the +stimulus by event : only signal transitions are described. After each +event there is a new input in the pattern file (see ``addpat`` +[addpat]). Last thing you should do in this part is to generate the +output file (see ``pattern_end`` [pattern:sub:`e`\ nd]). + +Methods +======= + +PatWrite +-------- + +This class is used to create patterns for *Stratus* models. Currently it +only supports Alliance “.pat” pattern format. Patterns time stamps are +in the “absolute date” format, “relative date” isn’t allowed. Legal time +unit are ps (default), ns, us and ms. The constructor takes as +parameters the pattern output filename and an optional reference to +Stratus cell. + +declar +------ + +Adds a connector from a Stratus model to the pattern interface. Writes +the corresponding connector declaration in the pattern file with name, +arity and direction automatically extracted from the connector +properties. +Supported Stratus connectors are: + +- SignalIn, + +- SignalOut (only supported if used as an output), + +- VddIn, + +- VssIn, + +- CkIn, + +- SignalInOut, + +- TriState (always an output), + +- Signals. + +Parameters +~~~~~~~~~~ + +- connector : can either be a reference to a stratus net or a string + containing the name of the stratus net. + +- format : optional format for the connectors values into the pattern + file, accepted values are : + + - ’B’: binary (default), + + - ’X’: hexadecimal, + + - ’O’: octal. + +declar\_interface +----------------- + +Adds all the connectors from a Stratus model to the pattern interface. +Write the corresponding connector declaration in the pattern file with +name, arity and direction directly taken from the connector proprieties. + +Parameters +~~~~~~~~~~ + +- cell : the tested Stratus model reference. Optional if a reference to + the tested Stratus model was given during instanciation[patwrite]. + +- format : optional format for the connectors values into the pattern + file, accepted values are : + + - ’B’: binary (default), + + - ’X’: hexadecimal, + + - ’O’: octal. + +declar +------ + +Affect a string value to a connector. + +Parameters +~~~~~~~~~~ + +- connector : *Stratus* connector + +- value : string to affect to connector + +affect\_int +----------- + +Affect an integer (CA2) value to a connector. Convert the 2’s complement +value to the corresponding binary value. The binary size is taken from +the connector arity. If the connector is an output, the binary value is +preceded by “?”. + +Parameters +~~~~~~~~~~ + +- connector : *Stratus* connector. + +- value : 2’s complement value to affect to the connector. + +affect\_fix +----------- + +Affect a fixed point value to a connector. Convert the floating point +input value to the corresponding fixed point value with +word\_length=connector.arity() and integer\_word\_length=iwl. If the +connector is an output, the binary value is preceded by “?”. + +Parameters +~~~~~~~~~~ + +- connector : *Stratus* connector. + +- value : floating point value to convert and asign to connector. + +- iwl : integer word length + +affect\_any +----------- + +Disable comparison between this connector value and the one calculated +during simulation. + +Parameters +~~~~~~~~~~ + +- connector : *Stratus* connector. + +addpat +------ + +Adds a pattern in the pattern file. + +pattern\_begin +-------------- + +Mark the end of the interface declaration and the beginning of the test +vectors. + +pattern\_end +------------ + +Mark the end of the test vectors and of the patterns file. + +Example +======= + +``Pattern`` method for an addaccu + +:: + + def Pattern(self): + # initialisation + pat = PatWrite(self._name+'.pat',self) + + # declaration of ports + pat.declar(self.ck, 'B') + pat.declar(self.load, 'B') + pat.declar(self.input, 'X') + pat.declar(self.output, 'X') + pat.declar(self.vdd, 'B') + pat.declar(self.vss, 'B') + + # use of pat.declar_interface(self) has the same effect + + # description beginning + pat.pattern_begin() + + # affect vdd and vss values + pat.affect_int(self.vdd,1) + pat.affect_int(self.vss,0) + + # first pattern : load an initial value + pat.affect_int(self.input,5) + pat.affect_int(self.load,1) + pat.affect_int(self.ck,0) + # add the pattern in the pattern file + pat.addpat() + # compute next event + pat.affect_int(self.ck,1) + pat.addpat() + + # compute 22 cycle of accumulation + pat.affect_int(self.load,0) + for i in range(1,22): + pat.affect_int(self.ck,0) + pat.addpat() + pat.affect_int(self.ck,1) + pat.affect_int(self.output,i+5) + pat.addpat() + + # end of the description + pat.pattern_end() + diff --git a/documentation/Stratus/Stratus.rst b/documentation/Stratus/Stratus.rst deleted file mode 100644 index f61b2dac..00000000 --- a/documentation/Stratus/Stratus.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. -*- Mode: rst -*- - -.. include:: ../etc/definitions.rst - - -=================== -Stratus Reference -=================== - -The Stratus Language reference is generated by LaTeX2HTML_ and is -available here: `Stratus `_ diff --git a/documentation/Stratus/images/Makefile.am b/documentation/Stratus/images/Makefile.am new file mode 100644 index 00000000..9689089a --- /dev/null +++ b/documentation/Stratus/images/Makefile.am @@ -0,0 +1,11 @@ + +doc_en_latex_imagesdir = $(datadir)/doc/en/latex/stratus/images + +doc_en_latex_images_DATA = add1.png \ + add2.png \ + addaccu.png \ + editor.png \ + test.png \ + xml.png + +EXTRA_DIST = $(doc_en_latex_images_DATA) diff --git a/documentation/Stratus/images/add1.png b/documentation/Stratus/images/add1.png new file mode 100644 index 0000000000000000000000000000000000000000..8270f2d4c8cf990124dc03f8583f6c376687ba5f GIT binary patch literal 5500 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 QO&I`HgQ=D%zxlxYKi=2_r~m)} literal 0 HcmV?d00001 diff --git a/documentation/Stratus/images/add2.png b/documentation/Stratus/images/add2.png new file mode 100644 index 0000000000000000000000000000000000000000..08ac408bef89074615347ddc3c6b03e99944d4e8 GIT binary patch literal 15347 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�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�Ui#fi;DGpd*QeUI0w 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 LLW!R91H^v;BC+=3 literal 0 HcmV?d00001 diff --git a/documentation/Stratus/images/resizeAb.png b/documentation/Stratus/images/resizeAb.png new file mode 100644 index 0000000000000000000000000000000000000000..96a0a39e5bca9c816f915ebd5dbb8d49ee4a6ce0 GIT binary patch literal 949 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 literal 0 HcmV?d00001 diff --git a/documentation/Stratus/images/xml.png b/documentation/Stratus/images/xml.png new file mode 100644 index 0000000000000000000000000000000000000000..35a496ada34acda5335b838e1e9074c5c7254dee GIT binary patch literal 44214 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 literal 0 HcmV?d00001 diff --git a/documentation/Stratus/index.rst b/documentation/Stratus/index.rst new file mode 100644 index 00000000..0abc6a9e --- /dev/null +++ b/documentation/Stratus/index.rst @@ -0,0 +1,20 @@ +.. -*- mode: rst; explicit-buffer-name: "index.rst" -*- + +.. include:: ../etc/definitions.rst + + +================================== +Stratus : Netlist Capture Language +================================== + +Printable version of this document `Stratus.pdf <../../../pdf/main/Stratus.pdf>`_. + +Stratus – Procedural design language based upon *Python* + +.. toctree:: + :maxdepth: 1 + + Language.rst + Developper.rst + Pattern.rst + DpGen.rst diff --git a/documentation/Stratus/pdfHeader.rst b/documentation/Stratus/pdfHeader.rst new file mode 100644 index 00000000..cde3ea09 --- /dev/null +++ b/documentation/Stratus/pdfHeader.rst @@ -0,0 +1,15 @@ +.. -*- Mode: rst -*- + +.. include:: ../etc/definitions.rst + + +======================= +Stratus User's Guide +======================= + +|pagestylefancy| + + +.. contents:: + +|newpage| diff --git a/documentation/_templates/indexcontent.html b/documentation/_templates/indexcontent.html index 703846f7..62d0138a 100644 --- a/documentation/_templates/indexcontent.html +++ b/documentation/_templates/indexcontent.html @@ -17,15 +17,11 @@ Graphical Interface C++ API

- - diff --git a/documentation/conf.py b/documentation/conf.py index 39712140..50a1ba21 100644 --- a/documentation/conf.py +++ b/documentation/conf.py @@ -66,6 +66,7 @@ release = '2' # directories to ignore when looking for source files. exclude_patterns = ['_build', 'UsersGuide/UsersGuide.rst', 'UsersGuide/pdfHeader.rst' , 'PythonCpp/PythonCpp.rst' , 'PythonCpp/pdfHeader.rst' + , 'Stratus/Stratus.rst' , 'Stratus/pdfHeader.rst' , 'RDS/RDS.rst' , 'RDS/pdfHeader.rst' ] # The reST default role (used for this markup: `text`) to use for all documents. diff --git a/documentation/index.rst b/documentation/index.rst index 09bf0f90..7cb537d3 100644 --- a/documentation/index.rst +++ b/documentation/index.rst @@ -13,9 +13,7 @@ Contents: .. toctree:: UsersGuide/index.rst - Stratus/Stratus.rst - DpGen/DpGen.rst - Patterns/Patterns.rst + Stratus/index.rst Hurricane/Hurricane.rst Viewer/Viewer.rst CrlCore/CrlCore.rst diff --git a/stratus1/CMakeLists.txt b/stratus1/CMakeLists.txt index 6685cdeb..8f881b10 100644 --- a/stratus1/CMakeLists.txt +++ b/stratus1/CMakeLists.txt @@ -3,7 +3,7 @@ set(CMAKE_LEGACY_CYGWIN_WIN32 0) project(STRATUS1) - option(BUILD_DOC "Build the documentation (latex2html)" OFF) + # option(BUILD_DOC "Build the documentation (latex2html)" OFF) cmake_minimum_required(VERSION 2.4.0) list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/") @@ -22,12 +22,12 @@ find_package(VLSISAPD REQUIRED) find_package(HURRICANE REQUIRED) find_package(CORIOLIS REQUIRED) - if(BUILD_DOC) - include(UseLATEX) - endif(BUILD_DOC) + #if(BUILD_DOC) + # include(UseLATEX) + #endif(BUILD_DOC) add_subdirectory(src) add_subdirectory(etc) - if(BUILD_DOC) - add_subdirectory(doc) - endif(BUILD_DOC) + #if(BUILD_DOC) + # add_subdirectory(doc) + #endif(BUILD_DOC) diff --git a/stratus1/configure.in b/stratus1/configure.in index d7d9ddd1..10ff4937 100644 --- a/stratus1/configure.in +++ b/stratus1/configure.in @@ -16,12 +16,12 @@ Makefile src/Makefile src/lib/Makefile src/dpgen/Makefile -doc/Makefile -doc/stratus/Makefile -doc/stratus/images/Makefile -doc/developper/Makefile -doc/dpgen/Makefile -doc/patterns/Makefile +#doc/Makefile +#doc/stratus/Makefile +#doc/stratus/images/Makefile +#doc/developper/Makefile +#doc/dpgen/Makefile +#doc/patterns/Makefile etc/Makefile modules/Makefile modules/patterns/Makefile