| % Generated using the yosys 'help -write-tex-command-reference-manual' command. |
| |
| \section{abc -- use ABC for technology mapping} |
| \label{cmd:abc} |
| \begin{lstlisting}[numbers=left,frame=single] |
| abc [options] [selection] |
| |
| This pass uses the ABC tool [1] for technology mapping of yosys's internal gate |
| library to a target architecture. |
| |
| -exe <command> |
| use the specified command instead of "<yosys-bindir>/yosys-abc" to execute ABC. |
| This can e.g. be used to call a specific version of ABC or a wrapper. |
| |
| -script <file> |
| use the specified ABC script file instead of the default script. |
| |
| if <file> starts with a plus sign (+), then the rest of the filename |
| string is interpreted as the command string to be passed to ABC. The |
| leading plus sign is removed and all commas (,) in the string are |
| replaced with blanks before the string is passed to ABC. |
| |
| if no -script parameter is given, the following scripts are used: |
| |
| for -liberty without -constr: |
| strash; ifraig; scorr; dc2; dretime; strash; &get -n; &dch -f; |
| &nf {D}; &put |
| |
| for -liberty with -constr: |
| strash; ifraig; scorr; dc2; dretime; strash; &get -n; &dch -f; |
| &nf {D}; &put; buffer; upsize {D}; dnsize {D}; stime -p |
| |
| for -lut/-luts (only one LUT size): |
| strash; ifraig; scorr; dc2; dretime; strash; dch -f; if; mfs2; |
| lutpack {S} |
| |
| for -lut/-luts (different LUT sizes): |
| strash; ifraig; scorr; dc2; dretime; strash; dch -f; if; mfs2 |
| |
| for -sop: |
| strash; ifraig; scorr; dc2; dretime; strash; dch -f; |
| cover {I} {P} |
| |
| otherwise: |
| strash; ifraig; scorr; dc2; dretime; strash; &get -n; &dch -f; |
| &nf {D}; &put |
| |
| -fast |
| use different default scripts that are slightly faster (at the cost |
| of output quality): |
| |
| for -liberty without -constr: |
| strash; dretime; map {D} |
| |
| for -liberty with -constr: |
| strash; dretime; map {D}; buffer; upsize {D}; dnsize {D}; |
| stime -p |
| |
| for -lut/-luts: |
| strash; dretime; if |
| |
| for -sop: |
| strash; dretime; cover -I {I} -P {P} |
| |
| otherwise: |
| strash; dretime; map |
| |
| -liberty <file> |
| generate netlists for the specified cell library (using the liberty |
| file format). |
| |
| -constr <file> |
| pass this file with timing constraints to ABC. use with -liberty. |
| |
| a constr file contains two lines: |
| set_driving_cell <cell_name> |
| set_load <floating_point_number> |
| |
| the set_driving_cell statement defines which cell type is assumed to |
| drive the primary inputs and the set_load statement sets the load in |
| femtofarads for each primary output. |
| |
| -D <picoseconds> |
| set delay target. the string {D} in the default scripts above is |
| replaced by this option when used, and an empty string otherwise. |
| this also replaces 'dretime' with 'dretime; retime -o {D}' in the |
| default scripts above. |
| |
| -I <num> |
| maximum number of SOP inputs. |
| (replaces {I} in the default scripts above) |
| |
| -P <num> |
| maximum number of SOP products. |
| (replaces {P} in the default scripts above) |
| |
| -S <num> |
| maximum number of LUT inputs shared. |
| (replaces {S} in the default scripts above, default: -S 1) |
| |
| -lut <width> |
| generate netlist using luts of (max) the specified width. |
| |
| -lut <w1>:<w2> |
| generate netlist using luts of (max) the specified width <w2>. All |
| luts with width <= <w1> have constant cost. for luts larger than <w1> |
| the area cost doubles with each additional input bit. the delay cost |
| is still constant for all lut widths. |
| |
| -luts <cost1>,<cost2>,<cost3>,<sizeN>:<cost4-N>,.. |
| generate netlist using luts. Use the specified costs for luts with 1, |
| 2, 3, .. inputs. |
| |
| -sop |
| map to sum-of-product cells and inverters |
| |
| -g type1,type2,... |
| Map to the specified list of gate types. Supported gates types are: |
| AND, NAND, OR, NOR, XOR, XNOR, ANDNOT, ORNOT, MUX, AOI3, OAI3, AOI4, OAI4. |
| (The NOT gate is always added to this list automatically.) |
| |
| The following aliases can be used to reference common sets of gate types: |
| simple: AND OR XOR MUX |
| cmos2: NAND NOR |
| cmos3: NAND NOR AOI3 OAI3 |
| cmos4: NAND NOR AOI3 OAI3 AOI4 OAI4 |
| gates: AND NAND OR NOR XOR XNOR ANDNOT ORNOT |
| aig: AND NAND OR NOR ANDNOT ORNOT |
| |
| Prefix a gate type with a '-' to remove it from the list. For example |
| the arguments 'AND,OR,XOR' and 'simple,-MUX' are equivalent. |
| |
| -dff |
| also pass $_DFF_?_ and $_DFFE_??_ cells through ABC. modules with many |
| clock domains are automatically partitioned in clock domains and each |
| domain is passed through ABC independently. |
| |
| -clk [!]<clock-signal-name>[,[!]<enable-signal-name>] |
| use only the specified clock domain. this is like -dff, but only FF |
| cells that belong to the specified clock domain are used. |
| |
| -keepff |
| set the "keep" attribute on flip-flop output wires. (and thus preserve |
| them, for example for equivalence checking.) |
| |
| -nocleanup |
| when this option is used, the temporary files created by this pass |
| are not removed. this is useful for debugging. |
| |
| -showtmp |
| print the temp dir name in log. usually this is suppressed so that the |
| command output is identical across runs. |
| |
| -markgroups |
| set a 'abcgroup' attribute on all objects created by ABC. The value of |
| this attribute is a unique integer for each ABC process started. This |
| is useful for debugging the partitioning of clock domains. |
| |
| When neither -liberty nor -lut is used, the Yosys standard cell library is |
| loaded into ABC before the ABC script is executed. |
| |
| Note that this is a logic optimization pass within Yosys that is calling ABC |
| internally. This is not going to "run ABC on your design". It will instead run |
| ABC on logic snippets extracted from your design. You will not get any useful |
| output when passing an ABC script that writes a file. Instead write your full |
| design as BLIF file with write_blif and the load that into ABC externally if |
| you want to use ABC to convert your design into another format. |
| |
| [1] http://www.eecs.berkeley.edu/~alanmi/abc/ |
| \end{lstlisting} |
| |
| \section{add -- add objects to the design} |
| \label{cmd:add} |
| \begin{lstlisting}[numbers=left,frame=single] |
| add <command> [selection] |
| |
| This command adds objects to the design. It operates on all fully selected |
| modules. So e.g. 'add -wire foo' will add a wire foo to all selected modules. |
| |
| |
| add {-wire|-input|-inout|-output} <name> <width> [selection] |
| |
| Add a wire (input, inout, output port) with the given name and width. The |
| command will fail if the object exists already and has different properties |
| than the object to be created. |
| |
| |
| add -global_input <name> <width> [selection] |
| |
| Like 'add -input', but also connect the signal between instances of the |
| selected modules. |
| \end{lstlisting} |
| |
| \section{aigmap -- map logic to and-inverter-graph circuit} |
| \label{cmd:aigmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| aigmap [options] [selection] |
| |
| Replace all logic cells with circuits made of only $_AND_ and |
| $_NOT_ cells. |
| |
| -nand |
| Enable creation of $_NAND_ cells |
| \end{lstlisting} |
| |
| \section{alumacc -- extract ALU and MACC cells} |
| \label{cmd:alumacc} |
| \begin{lstlisting}[numbers=left,frame=single] |
| alumacc [selection] |
| |
| This pass translates arithmetic operations like $add, $mul, $lt, etc. to $alu |
| and $macc cells. |
| \end{lstlisting} |
| |
| \section{assertpmux -- convert internal signals to module ports} |
| \label{cmd:assertpmux} |
| \begin{lstlisting}[numbers=left,frame=single] |
| assertpmux [options] [selection] |
| |
| This command adds asserts to the design that assert that all parallel muxes |
| ($pmux cells) have a maximum of one of their inputs enable at any time. |
| |
| -noinit |
| do not enforce the pmux condition during the init state |
| |
| -always |
| usually the $pmux condition is only checked when the $pmux output |
| is used be the mux tree it drives. this option will deactivate this |
| additional constrained and check the $pmux condition always. |
| \end{lstlisting} |
| |
| \section{async2sync -- convert async FF inputs to sync circuits} |
| \label{cmd:async2sync} |
| \begin{lstlisting}[numbers=left,frame=single] |
| async2sync [options] [selection] |
| |
| This command replaces async FF inputs with sync circuits emulating the same |
| behavior for when the async signals are actually synchronized to the clock. |
| |
| This pass assumes negative hold time for the async FF inputs. For example when |
| a reset deasserts with the clock edge, then the FF output will still drive the |
| reset value in the next cycle regardless of the data-in value at the time of |
| the clock edge. |
| |
| Currently only $adff cells are supported by this pass. |
| \end{lstlisting} |
| |
| \section{attrmap -- renaming attributes} |
| \label{cmd:attrmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| attrmap [options] [selection] |
| |
| This command renames attributes and/or mapps key/value pairs to |
| other key/value pairs. |
| |
| -tocase <name> |
| Match attribute names case-insensitively and set it to the specified |
| name. |
| |
| -rename <old_name> <new_name> |
| Rename attributes as specified |
| |
| -map <old_name>=<old_value> <new_name>=<new_value> |
| Map key/value pairs as indicated. |
| |
| -imap <old_name>=<old_value> <new_name>=<new_value> |
| Like -map, but use case-insensitive match for <old_value> when |
| it is a string value. |
| |
| -remove <name>=<value> |
| Remove attributes matching this pattern. |
| |
| -modattr |
| Operate on module attributes instead of attributes on wires and cells. |
| |
| For example, mapping Xilinx-style "keep" attributes to Yosys-style: |
| |
| attrmap -tocase keep -imap keep="true" keep=1 \ |
| -imap keep="false" keep=0 -remove keep=0 |
| \end{lstlisting} |
| |
| \section{attrmvcp -- move or copy attributes from wires to driving cells} |
| \label{cmd:attrmvcp} |
| \begin{lstlisting}[numbers=left,frame=single] |
| attrmvcp [options] [selection] |
| |
| Move or copy attributes on wires to the cells driving them. |
| |
| -copy |
| By default, attributes are moved. This will only add |
| the attribute to the cell, without removing it from |
| the wire. |
| |
| -purge |
| If no selected cell consumes the attribute, then it is |
| left on the wire by default. This option will cause the |
| attribute to be removed from the wire, even if no selected |
| cell takes it. |
| |
| -driven |
| By default, attriburtes are moved to the cell driving the |
| wire. With this option set it will be moved to the cell |
| driven by the wire instead. |
| |
| -attr <attrname> |
| Move or copy this attribute. This option can be used |
| multiple times. |
| \end{lstlisting} |
| |
| \section{blackbox -- change type of cells in the design} |
| \label{cmd:blackbox} |
| \begin{lstlisting}[numbers=left,frame=single] |
| blackbox [options] [selection] |
| |
| Convert modules into blackbox modules (remove contents and set the blackbox |
| module attribute). |
| \end{lstlisting} |
| |
| \section{cd -- a shortcut for 'select -module <name>'} |
| \label{cmd:cd} |
| \begin{lstlisting}[numbers=left,frame=single] |
| cd <modname> |
| |
| This is just a shortcut for 'select -module <modname>'. |
| |
| |
| cd <cellname> |
| |
| When no module with the specified name is found, but there is a cell |
| with the specified name in the current module, then this is equivalent |
| to 'cd <celltype>'. |
| |
| cd .. |
| |
| Remove trailing substrings that start with '.' in current module name until |
| the name of a module in the current design is generated, then switch to that |
| module. Otherwise clear the current selection. |
| |
| cd |
| |
| This is just a shortcut for 'select -clear'. |
| \end{lstlisting} |
| |
| \section{check -- check for obvious problems in the design} |
| \label{cmd:check} |
| \begin{lstlisting}[numbers=left,frame=single] |
| check [options] [selection] |
| |
| This pass identifies the following problems in the current design: |
| |
| - combinatorial loops |
| |
| - two or more conflicting drivers for one wire |
| |
| - used wires that do not have a driver |
| |
| When called with -noinit then this command also checks for wires which have |
| the 'init' attribute set. |
| |
| When called with -initdrv then this command also checks for wires which have |
| the 'init' attribute set and aren't driven by a FF cell type. |
| |
| When called with -assert then the command will produce an error if any |
| problems are found in the current design. |
| \end{lstlisting} |
| |
| \section{chformal -- change formal constraints of the design} |
| \label{cmd:chformal} |
| \begin{lstlisting}[numbers=left,frame=single] |
| chformal [types] [mode] [options] [selection] |
| |
| Make changes to the formal constraints of the design. The [types] options |
| the type of constraint to operate on. If none of the folling options is given, |
| the command will operate on all constraint types: |
| |
| -assert $assert cells, representing assert(...) constraints |
| -assume $assume cells, representing assume(...) constraints |
| -live $live cells, representing assert(s_eventually ...) |
| -fair $fair cells, representing assume(s_eventually ...) |
| -cover $cover cells, representing cover() statements |
| |
| Exactly one of the following modes must be specified: |
| |
| -remove |
| remove the cells and thus constraints from the design |
| |
| -early |
| bypass FFs that only delay the activation of a constraint |
| |
| -delay <N> |
| delay activation of the constraint by <N> clock cycles |
| |
| -skip <N> |
| ignore activation of the constraint in the first <N> clock cycles |
| |
| -assert2assume |
| -assume2assert |
| -live2fair |
| -fair2live |
| change the roles of cells as indicated. this options can be combined |
| \end{lstlisting} |
| |
| \section{chparam -- re-evaluate modules with new parameters} |
| \label{cmd:chparam} |
| \begin{lstlisting}[numbers=left,frame=single] |
| chparam [ -set name value ]... [selection] |
| |
| Re-evaluate the selected modules with new parameters. String values must be |
| passed in double quotes ("). |
| |
| |
| chparam -list [selection] |
| |
| List the available parameters of the selected modules. |
| \end{lstlisting} |
| |
| \section{chtype -- change type of cells in the design} |
| \label{cmd:chtype} |
| \begin{lstlisting}[numbers=left,frame=single] |
| chtype [options] [selection] |
| |
| Change the types of cells in the design. |
| |
| -set <type> |
| set the cell type to the given type |
| |
| -map <old_type> <new_type> |
| change cells types that match <old_type> to <new_type> |
| \end{lstlisting} |
| |
| \section{clean -- remove unused cells and wires} |
| \label{cmd:clean} |
| \begin{lstlisting}[numbers=left,frame=single] |
| clean [options] [selection] |
| |
| This is identical to 'opt_clean', but less verbose. |
| |
| When commands are separated using the ';;' token, this command will be executed |
| between the commands. |
| |
| When commands are separated using the ';;;' token, this command will be executed |
| in -purge mode between the commands. |
| \end{lstlisting} |
| |
| \section{clk2fflogic -- convert clocked FFs to generic \$ff cells} |
| \label{cmd:clk2fflogic} |
| \begin{lstlisting}[numbers=left,frame=single] |
| clk2fflogic [options] [selection] |
| |
| This command replaces clocked flip-flops with generic $ff cells that use the |
| implicit global clock. This is useful for formal verification of designs with |
| multiple clocks. |
| \end{lstlisting} |
| |
| \section{connect -- create or remove connections} |
| \label{cmd:connect} |
| \begin{lstlisting}[numbers=left,frame=single] |
| connect [-nomap] [-nounset] -set <lhs-expr> <rhs-expr> |
| |
| Create a connection. This is equivalent to adding the statement 'assign |
| <lhs-expr> = <rhs-expr>;' to the Verilog input. Per default, all existing |
| drivers for <lhs-expr> are unconnected. This can be overwritten by using |
| the -nounset option. |
| |
| |
| connect [-nomap] -unset <expr> |
| |
| Unconnect all existing drivers for the specified expression. |
| |
| |
| connect [-nomap] -port <cell> <port> <expr> |
| |
| Connect the specified cell port to the specified cell port. |
| |
| |
| Per default signal alias names are resolved and all signal names are mapped |
| the the signal name of the primary driver. Using the -nomap option deactivates |
| this behavior. |
| |
| The connect command operates in one module only. Either only one module must |
| be selected or an active module must be set using the 'cd' command. |
| |
| This command does not operate on module with processes. |
| \end{lstlisting} |
| |
| \section{connwrappers -- match width of input-output port pairs} |
| \label{cmd:connwrappers} |
| \begin{lstlisting}[numbers=left,frame=single] |
| connwrappers [options] [selection] |
| |
| Wrappers are used in coarse-grain synthesis to wrap cells with smaller ports |
| in wrapper cells with a (larger) constant port size. I.e. the upper bits |
| of the wrapper output are signed/unsigned bit extended. This command uses this |
| knowledge to rewire the inputs of the driven cells to match the output of |
| the driving cell. |
| |
| -signed <cell_type> <port_name> <width_param> |
| -unsigned <cell_type> <port_name> <width_param> |
| consider the specified signed/unsigned wrapper output |
| |
| -port <cell_type> <port_name> <width_param> <sign_param> |
| use the specified parameter to decide if signed or unsigned |
| |
| The options -signed, -unsigned, and -port can be specified multiple times. |
| \end{lstlisting} |
| |
| \section{coolrunner2\_sop -- break \$sop cells into ANDTERM/ORTERM cells} |
| \label{cmd:coolrunner2_sop} |
| \begin{lstlisting}[numbers=left,frame=single] |
| coolrunner2_sop [options] [selection] |
| |
| Break $sop cells into ANDTERM/ORTERM cells. |
| \end{lstlisting} |
| |
| \section{copy -- copy modules in the design} |
| \label{cmd:copy} |
| \begin{lstlisting}[numbers=left,frame=single] |
| copy old_name new_name |
| |
| Copy the specified module. Note that selection patterns are not supported |
| by this command. |
| \end{lstlisting} |
| |
| \section{cover -- print code coverage counters} |
| \label{cmd:cover} |
| \begin{lstlisting}[numbers=left,frame=single] |
| cover [options] [pattern] |
| |
| Print the code coverage counters collected using the cover() macro in the Yosys |
| C++ code. This is useful to figure out what parts of Yosys are utilized by a |
| test bench. |
| |
| -q |
| Do not print output to the normal destination (console and/or log file) |
| |
| -o file |
| Write output to this file, truncate if exists. |
| |
| -a file |
| Write output to this file, append if exists. |
| |
| -d dir |
| Write output to a newly created file in the specified directory. |
| |
| When one or more pattern (shell wildcards) are specified, then only counters |
| matching at least one pattern are printed. |
| |
| |
| It is also possible to instruct Yosys to print the coverage counters on program |
| exit to a file using environment variables: |
| |
| YOSYS_COVER_DIR="{dir-name}" yosys {args} |
| |
| This will create a file (with an auto-generated name) in this |
| directory and write the coverage counters to it. |
| |
| YOSYS_COVER_FILE="{file-name}" yosys {args} |
| |
| This will append the coverage counters to the specified file. |
| |
| |
| Hint: Use the following AWK command to consolidate Yosys coverage files: |
| |
| gawk '{ p[$3] = $1; c[$3] += $2; } END { for (i in p) |
| printf "%-60s %10d %s\n", p[i], c[i], i; }' {files} | sort -k3 |
| |
| |
| Coverage counters are only available in Yosys for Linux. |
| \end{lstlisting} |
| |
| \section{delete -- delete objects in the design} |
| \label{cmd:delete} |
| \begin{lstlisting}[numbers=left,frame=single] |
| delete [selection] |
| |
| Deletes the selected objects. This will also remove entire modules, if the |
| whole module is selected. |
| |
| |
| delete {-input|-output|-port} [selection] |
| |
| Does not delete any object but removes the input and/or output flag on the |
| selected wires, thus 'deleting' module ports. |
| \end{lstlisting} |
| |
| \section{deminout -- demote inout ports to input or output} |
| \label{cmd:deminout} |
| \begin{lstlisting}[numbers=left,frame=single] |
| deminout [options] [selection] |
| |
| "Demote" inout ports to input or output ports, if possible. |
| \end{lstlisting} |
| |
| \section{design -- save, restore and reset current design} |
| \label{cmd:design} |
| \begin{lstlisting}[numbers=left,frame=single] |
| design -reset |
| |
| Clear the current design. |
| |
| |
| design -save <name> |
| |
| Save the current design under the given name. |
| |
| |
| design -stash <name> |
| |
| Save the current design under the given name and then clear the current design. |
| |
| |
| design -push |
| |
| Push the current design to the stack and then clear the current design. |
| |
| |
| design -pop |
| |
| Reset the current design and pop the last design from the stack. |
| |
| |
| design -load <name> |
| |
| Reset the current design and load the design previously saved under the given |
| name. |
| |
| |
| design -copy-from <name> [-as <new_mod_name>] <selection> |
| |
| Copy modules from the specified design into the current one. The selection is |
| evaluated in the other design. |
| |
| |
| design -copy-to <name> [-as <new_mod_name>] [selection] |
| |
| Copy modules from the current design into the specified one. |
| |
| |
| design -import <name> [-as <new_top_name>] [selection] |
| |
| Import the specified design into the current design. The source design must |
| either have a selected top module or the selection must contain exactly one |
| module that is then used as top module for this command. |
| |
| |
| design -reset-vlog |
| |
| The Verilog front-end remembers defined macros and top-level declarations |
| between calls to 'read_verilog'. This command resets this memory. |
| \end{lstlisting} |
| |
| \section{dff2dffe -- transform \$dff cells to \$dffe cells} |
| \label{cmd:dff2dffe} |
| \begin{lstlisting}[numbers=left,frame=single] |
| dff2dffe [options] [selection] |
| |
| This pass transforms $dff cells driven by a tree of multiplexers with one or |
| more feedback paths to $dffe cells. It also works on gate-level cells such as |
| $_DFF_P_, $_DFF_N_ and $_MUX_. |
| |
| -unmap |
| operate in the opposite direction: replace $dffe cells with combinations |
| of $dff and $mux cells. the options below are ignore in unmap mode. |
| |
| -direct <internal_gate_type> <external_gate_type> |
| map directly to external gate type. <internal_gate_type> can |
| be any internal gate-level FF cell (except $_DFFE_??_). the |
| <external_gate_type> is the cell type name for a cell with an |
| identical interface to the <internal_gate_type>, except it |
| also has an high-active enable port 'E'. |
| Usually <external_gate_type> is an intermediate cell type |
| that is then translated to the final type using 'techmap'. |
| |
| -direct-match <pattern> |
| like -direct for all DFF cell types matching the expression. |
| this will use $__DFFE_* as <external_gate_type> matching the |
| internal gate type $_DFF_*_, and $__DFFSE_* for those matching |
| $_DFFS_*_, except for $_DFF_[NP]_, which is converted to |
| $_DFFE_[NP]_. |
| \end{lstlisting} |
| |
| \section{dff2dffs -- process sync set/reset with SR over CE priority} |
| \label{cmd:dff2dffs} |
| \begin{lstlisting}[numbers=left,frame=single] |
| dff2dffs [options] [selection] |
| |
| Merge synchronous set/reset $_MUX_ cells to create $__DFFS_[NP][NP][01], to be run before |
| dff2dffe for SR over CE priority. |
| \end{lstlisting} |
| |
| \section{dffinit -- set INIT param on FF cells} |
| \label{cmd:dffinit} |
| \begin{lstlisting}[numbers=left,frame=single] |
| dffinit [options] [selection] |
| |
| This pass sets an FF cell parameter to the the initial value of the net it |
| drives. (This is primarily used in FPGA flows.) |
| |
| -ff <cell_name> <output_port> <init_param> |
| operate on the specified cell type. this option can be used |
| multiple times. |
| |
| -highlow |
| use the string values "high" and "low" to represent a single-bit |
| initial value of 1 or 0. (multi-bit values are not supported in this |
| mode.) |
| \end{lstlisting} |
| |
| \section{dfflibmap -- technology mapping of flip-flops} |
| \label{cmd:dfflibmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| dfflibmap [-prepare] -liberty <file> [selection] |
| |
| Map internal flip-flop cells to the flip-flop cells in the technology |
| library specified in the given liberty file. |
| |
| This pass may add inverters as needed. Therefore it is recommended to |
| first run this pass and then map the logic paths to the target technology. |
| |
| When called with -prepare, this command will convert the internal FF cells |
| to the internal cell types that best match the cells found in the given |
| liberty file. |
| \end{lstlisting} |
| |
| \section{dffsr2dff -- convert DFFSR cells to simpler FF cell types} |
| \label{cmd:dffsr2dff} |
| \begin{lstlisting}[numbers=left,frame=single] |
| dffsr2dff [options] [selection] |
| |
| This pass converts DFFSR cells ($dffsr, $_DFFSR_???_) and ADFF cells ($adff, |
| $_DFF_???_) to simpler FF cell types when any of the set/reset inputs is unused. |
| \end{lstlisting} |
| |
| \section{dump -- print parts of the design in ilang format} |
| \label{cmd:dump} |
| \begin{lstlisting}[numbers=left,frame=single] |
| dump [options] [selection] |
| |
| Write the selected parts of the design to the console or specified file in |
| ilang format. |
| |
| -m |
| also dump the module headers, even if only parts of a single |
| module is selected |
| |
| -n |
| only dump the module headers if the entire module is selected |
| |
| -o <filename> |
| write to the specified file. |
| |
| -a <filename> |
| like -outfile but append instead of overwrite |
| \end{lstlisting} |
| |
| \section{echo -- turning echoing back of commands on and off} |
| \label{cmd:echo} |
| \begin{lstlisting}[numbers=left,frame=single] |
| echo on |
| |
| Print all commands to log before executing them. |
| |
| |
| echo off |
| |
| Do not print all commands to log before executing them. (default) |
| \end{lstlisting} |
| |
| \section{edgetypes -- list all types of edges in selection} |
| \label{cmd:edgetypes} |
| \begin{lstlisting}[numbers=left,frame=single] |
| edgetypes [options] [selection] |
| |
| This command lists all unique types of 'edges' found in the selection. An 'edge' |
| is a 4-tuple of source and sink cell type and port name. |
| \end{lstlisting} |
| |
| \section{equiv\_add -- add a \$equiv cell} |
| \label{cmd:equiv_add} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_add [-try] gold_sig gate_sig |
| |
| This command adds an $equiv cell for the specified signals. |
| |
| |
| equiv_add [-try] -cell gold_cell gate_cell |
| |
| This command adds $equiv cells for the ports of the specified cells. |
| \end{lstlisting} |
| |
| \section{equiv\_induct -- proving \$equiv cells using temporal induction} |
| \label{cmd:equiv_induct} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_induct [options] [selection] |
| |
| Uses a version of temporal induction to prove $equiv cells. |
| |
| Only selected $equiv cells are proven and only selected cells are used to |
| perform the proof. |
| |
| -undef |
| enable modelling of undef states |
| |
| -seq <N> |
| the max. number of time steps to be considered (default = 4) |
| |
| This command is very effective in proving complex sequential circuits, when |
| the internal state of the circuit quickly propagates to $equiv cells. |
| |
| However, this command uses a weak definition of 'equivalence': This command |
| proves that the two circuits will not diverge after they produce equal |
| outputs (observable points via $equiv) for at least <N> cycles (the <N> |
| specified via -seq). |
| |
| Combined with simulation this is very powerful because simulation can give |
| you confidence that the circuits start out synced for at least <N> cycles |
| after reset. |
| \end{lstlisting} |
| |
| \section{equiv\_make -- prepare a circuit for equivalence checking} |
| \label{cmd:equiv_make} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_make [options] gold_module gate_module equiv_module |
| |
| This creates a module annotated with $equiv cells from two presumably |
| equivalent modules. Use commands such as 'equiv_simple' and 'equiv_status' |
| to work with the created equivalent checking module. |
| |
| -inames |
| Also match cells and wires with $... names. |
| |
| -blacklist <file> |
| Do not match cells or signals that match the names in the file. |
| |
| -encfile <file> |
| Match FSM encodings using the description from the file. |
| See 'help fsm_recode' for details. |
| |
| Note: The circuit created by this command is not a miter (with something like |
| a trigger output), but instead uses $equiv cells to encode the equivalence |
| checking problem. Use 'miter -equiv' if you want to create a miter circuit. |
| \end{lstlisting} |
| |
| \section{equiv\_mark -- mark equivalence checking regions} |
| \label{cmd:equiv_mark} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_mark [options] [selection] |
| |
| This command marks the regions in an equivalence checking module. Region 0 is |
| the proven part of the circuit. Regions with higher numbers are connected |
| unproven subcricuits. The integer attribute 'equiv_region' is set on all |
| wires and cells. |
| \end{lstlisting} |
| |
| \section{equiv\_miter -- extract miter from equiv circuit} |
| \label{cmd:equiv_miter} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_miter [options] miter_module [selection] |
| |
| This creates a miter module for further analysis of the selected $equiv cells. |
| |
| -trigger |
| Create a trigger output |
| |
| -cmp |
| Create cmp_* outputs for individual unproven $equiv cells |
| |
| -assert |
| Create a $assert cell for each unproven $equiv cell |
| |
| -undef |
| Create compare logic that handles undefs correctly |
| \end{lstlisting} |
| |
| \section{equiv\_purge -- purge equivalence checking module} |
| \label{cmd:equiv_purge} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_purge [options] [selection] |
| |
| This command removes the proven part of an equivalence checking module, leaving |
| only the unproven segments in the design. This will also remove and add module |
| ports as needed. |
| \end{lstlisting} |
| |
| \section{equiv\_remove -- remove \$equiv cells} |
| \label{cmd:equiv_remove} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_remove [options] [selection] |
| |
| This command removes the selected $equiv cells. If neither -gold nor -gate is |
| used then only proven cells are removed. |
| |
| -gold |
| keep gold circuit |
| |
| -gate |
| keep gate circuit |
| \end{lstlisting} |
| |
| \section{equiv\_simple -- try proving simple \$equiv instances} |
| \label{cmd:equiv_simple} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_simple [options] [selection] |
| |
| This command tries to prove $equiv cells using a simple direct SAT approach. |
| |
| -v |
| verbose output |
| |
| -undef |
| enable modelling of undef states |
| |
| -short |
| create shorter input cones that stop at shared nodes. This yields |
| simpler SAT problems but sometimes fails to prove equivalence. |
| |
| -nogroup |
| disabling grouping of $equiv cells by output wire |
| |
| -seq <N> |
| the max. number of time steps to be considered (default = 1) |
| \end{lstlisting} |
| |
| \section{equiv\_status -- print status of equivalent checking module} |
| \label{cmd:equiv_status} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_status [options] [selection] |
| |
| This command prints status information for all selected $equiv cells. |
| |
| -assert |
| produce an error if any unproven $equiv cell is found |
| \end{lstlisting} |
| |
| \section{equiv\_struct -- structural equivalence checking} |
| \label{cmd:equiv_struct} |
| \begin{lstlisting}[numbers=left,frame=single] |
| equiv_struct [options] [selection] |
| |
| This command adds additional $equiv cells based on the assumption that the |
| gold and gate circuit are structurally equivalent. Note that this can introduce |
| bad $equiv cells in cases where the netlists are not structurally equivalent, |
| for example when analyzing circuits with cells with commutative inputs. This |
| command will also de-duplicate gates. |
| |
| -fwd |
| by default this command performans forward sweeps until nothing can |
| be merged by forwards sweeps, then backward sweeps until forward |
| sweeps are effective again. with this option set only forward sweeps |
| are performed. |
| |
| -fwonly <cell_type> |
| add the specified cell type to the list of cell types that are only |
| merged in forward sweeps and never in backward sweeps. $equiv is in |
| this list automatically. |
| |
| -icells |
| by default, the internal RTL and gate cell types are ignored. add |
| this option to also process those cell types with this command. |
| |
| -maxiter <N> |
| maximum number of iterations to run before aborting |
| \end{lstlisting} |
| |
| \section{eval -- evaluate the circuit given an input} |
| \label{cmd:eval} |
| \begin{lstlisting}[numbers=left,frame=single] |
| eval [options] [selection] |
| |
| This command evaluates the value of a signal given the value of all required |
| inputs. |
| |
| -set <signal> <value> |
| set the specified signal to the specified value. |
| |
| -set-undef |
| set all unspecified source signals to undef (x) |
| |
| -table <signal> |
| create a truth table using the specified input signals |
| |
| -show <signal> |
| show the value for the specified signal. if no -show option is passed |
| then all output ports of the current module are used. |
| \end{lstlisting} |
| |
| \section{expose -- convert internal signals to module ports} |
| \label{cmd:expose} |
| \begin{lstlisting}[numbers=left,frame=single] |
| expose [options] [selection] |
| |
| This command exposes all selected internal signals of a module as additional |
| outputs. |
| |
| -dff |
| only consider wires that are directly driven by register cell. |
| |
| -cut |
| when exposing a wire, create an input/output pair and cut the internal |
| signal path at that wire. |
| |
| -input |
| when exposing a wire, create an input port and disconnect the internal |
| driver. |
| |
| -shared |
| only expose those signals that are shared among the selected modules. |
| this is useful for preparing modules for equivalence checking. |
| |
| -evert |
| also turn connections to instances of other modules to additional |
| inputs and outputs and remove the module instances. |
| |
| -evert-dff |
| turn flip-flops to sets of inputs and outputs. |
| |
| -sep <separator> |
| when creating new wire/port names, the original object name is suffixed |
| with this separator (default: '.') and the port name or a type |
| designator for the exposed signal. |
| \end{lstlisting} |
| |
| \section{extract -- find subcircuits and replace them with cells} |
| \label{cmd:extract} |
| \begin{lstlisting}[numbers=left,frame=single] |
| extract -map <map_file> [options] [selection] |
| extract -mine <out_file> [options] [selection] |
| |
| This pass looks for subcircuits that are isomorphic to any of the modules |
| in the given map file and replaces them with instances of this modules. The |
| map file can be a Verilog source file (*.v) or an ilang file (*.il). |
| |
| -map <map_file> |
| use the modules in this file as reference. This option can be used |
| multiple times. |
| |
| -map %<design-name> |
| use the modules in this in-memory design as reference. This option can |
| be used multiple times. |
| |
| -verbose |
| print debug output while analyzing |
| |
| -constports |
| also find instances with constant drivers. this may be much |
| slower than the normal operation. |
| |
| -nodefaultswaps |
| normally builtin port swapping rules for internal cells are used per |
| default. This turns that off, so e.g. 'a^b' does not match 'b^a' |
| when this option is used. |
| |
| -compat <needle_type> <haystack_type> |
| Per default, the cells in the map file (needle) must have the |
| type as the cells in the active design (haystack). This option |
| can be used to register additional pairs of types that should |
| match. This option can be used multiple times. |
| |
| -swap <needle_type> <port1>,<port2>[,...] |
| Register a set of swappable ports for a needle cell type. |
| This option can be used multiple times. |
| |
| -perm <needle_type> <port1>,<port2>[,...] <portA>,<portB>[,...] |
| Register a valid permutation of swappable ports for a needle |
| cell type. This option can be used multiple times. |
| |
| -cell_attr <attribute_name> |
| Attributes on cells with the given name must match. |
| |
| -wire_attr <attribute_name> |
| Attributes on wires with the given name must match. |
| |
| -ignore_parameters |
| Do not use parameters when matching cells. |
| |
| -ignore_param <cell_type> <parameter_name> |
| Do not use this parameter when matching cells. |
| |
| This pass does not operate on modules with unprocessed processes in it. |
| (I.e. the 'proc' pass should be used first to convert processes to netlists.) |
| |
| This pass can also be used for mining for frequent subcircuits. In this mode |
| the following options are to be used instead of the -map option. |
| |
| -mine <out_file> |
| mine for frequent subcircuits and write them to the given ilang file |
| |
| -mine_cells_span <min> <max> |
| only mine for subcircuits with the specified number of cells |
| default value: 3 5 |
| |
| -mine_min_freq <num> |
| only mine for subcircuits with at least the specified number of matches |
| default value: 10 |
| |
| -mine_limit_matches_per_module <num> |
| when calculating the number of matches for a subcircuit, don't count |
| more than the specified number of matches per module |
| |
| -mine_max_fanout <num> |
| don't consider internal signals with more than <num> connections |
| |
| The modules in the map file may have the attribute 'extract_order' set to an |
| integer value. Then this value is used to determine the order in which the pass |
| tries to map the modules to the design (ascending, default value is 0). |
| |
| See 'help techmap' for a pass that does the opposite thing. |
| \end{lstlisting} |
| |
| \section{extract\_counter -- Extract GreenPak4 counter cells} |
| \label{cmd:extract_counter} |
| \begin{lstlisting}[numbers=left,frame=single] |
| extract_counter [options] [selection] |
| |
| This pass converts non-resettable or async resettable down counters to |
| counter cells. Use a target-specific 'techmap' map file to convert those cells |
| to the actual target cells. |
| |
| -maxwidth N |
| Only extract counters up to N bits wide |
| |
| -pout X,Y,... |
| Only allow parallel output from the counter to the listed cell types |
| (if not specified, parallel outputs are not restricted) |
| \end{lstlisting} |
| |
| \section{extract\_fa -- find and extract full/half adders} |
| \label{cmd:extract_fa} |
| \begin{lstlisting}[numbers=left,frame=single] |
| extract_fa [options] [selection] |
| |
| This pass extracts full/half adders from a gate-level design. |
| |
| -fa, -ha |
| Enable cell types (fa=full adder, ha=half adder) |
| All types are enabled if none of this options is used |
| |
| -d <int> |
| Set maximum depth for extracted logic cones (default=20) |
| |
| -b <int> |
| Set maximum breadth for extracted logic cones (default=6) |
| |
| -v |
| Verbose output |
| \end{lstlisting} |
| |
| \section{extract\_reduce -- converts gate chains into \$reduce\_* cells} |
| \label{cmd:extract_reduce} |
| \begin{lstlisting}[numbers=left,frame=single] |
| extract_reduce [options] [selection] |
| |
| converts gate chains into $reduce_* cells |
| |
| This command finds chains of $_AND_, $_OR_, and $_XOR_ cells and replaces them |
| with their corresponding $reduce_* cells. Because this command only operates on |
| these cell types, it is recommended to map the design to only these cell types |
| using the `abc -g` command. Note that, in some cases, it may be more effective |
| to map the design to only $_AND_ cells, run extract_reduce, map the remaining |
| parts of the design to AND/OR/XOR cells, and run extract_reduce a second time. |
| |
| -allow-off-chain |
| Allows matching of cells that have loads outside the chain. These cells |
| will be replicated and folded into the $reduce_* cell, but the original |
| cell will remain, driving its original loads. |
| \end{lstlisting} |
| |
| \section{flatten -- flatten design} |
| \label{cmd:flatten} |
| \begin{lstlisting}[numbers=left,frame=single] |
| flatten [selection] |
| |
| This pass flattens the design by replacing cells by their implementation. This |
| pass is very similar to the 'techmap' pass. The only difference is that this |
| pass is using the current design as mapping library. |
| |
| Cells and/or modules with the 'keep_hierarchy' attribute set will not be |
| flattened by this command. |
| \end{lstlisting} |
| |
| \section{freduce -- perform functional reduction} |
| \label{cmd:freduce} |
| \begin{lstlisting}[numbers=left,frame=single] |
| freduce [options] [selection] |
| |
| This pass performs functional reduction in the circuit. I.e. if two nodes are |
| equivalent, they are merged to one node and one of the redundant drivers is |
| disconnected. A subsequent call to 'clean' will remove the redundant drivers. |
| |
| -v, -vv |
| enable verbose or very verbose output |
| |
| -inv |
| enable explicit handling of inverted signals |
| |
| -stop <n> |
| stop after <n> reduction operations. this is mostly used for |
| debugging the freduce command itself. |
| |
| -dump <prefix> |
| dump the design to <prefix>_<module>_<num>.il after each reduction |
| operation. this is mostly used for debugging the freduce command. |
| |
| This pass is undef-aware, i.e. it considers don't-care values for detecting |
| equivalent nodes. |
| |
| All selected wires are considered for rewiring. The selected cells cover the |
| circuit that is analyzed. |
| \end{lstlisting} |
| |
| \section{fsm -- extract and optimize finite state machines} |
| \label{cmd:fsm} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm [options] [selection] |
| |
| This pass calls all the other fsm_* passes in a useful order. This performs |
| FSM extraction and optimization. It also calls opt_clean as needed: |
| |
| fsm_detect unless got option -nodetect |
| fsm_extract |
| |
| fsm_opt |
| opt_clean |
| fsm_opt |
| |
| fsm_expand if got option -expand |
| opt_clean if got option -expand |
| fsm_opt if got option -expand |
| |
| fsm_recode unless got option -norecode |
| |
| fsm_info |
| |
| fsm_export if got option -export |
| fsm_map unless got option -nomap |
| |
| Options: |
| |
| -expand, -norecode, -export, -nomap |
| enable or disable passes as indicated above |
| |
| -fullexpand |
| call expand with -full option |
| |
| -encoding type |
| -fm_set_fsm_file file |
| -encfile file |
| passed through to fsm_recode pass |
| \end{lstlisting} |
| |
| \section{fsm\_detect -- finding FSMs in design} |
| \label{cmd:fsm_detect} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_detect [selection] |
| |
| This pass detects finite state machines by identifying the state signal. |
| The state signal is then marked by setting the attribute 'fsm_encoding' |
| on the state signal to "auto". |
| |
| Existing 'fsm_encoding' attributes are not changed by this pass. |
| |
| Signals can be protected from being detected by this pass by setting the |
| 'fsm_encoding' attribute to "none". |
| \end{lstlisting} |
| |
| \section{fsm\_expand -- expand FSM cells by merging logic into it} |
| \label{cmd:fsm_expand} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_expand [-full] [selection] |
| |
| The fsm_extract pass is conservative about the cells that belong to a finite |
| state machine. This pass can be used to merge additional auxiliary gates into |
| the finite state machine. |
| |
| By default, fsm_expand is still a bit conservative regarding merging larger |
| word-wide cells. Call with -full to consider all cells for merging. |
| \end{lstlisting} |
| |
| \section{fsm\_export -- exporting FSMs to KISS2 files} |
| \label{cmd:fsm_export} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_export [-noauto] [-o filename] [-origenc] [selection] |
| |
| This pass creates a KISS2 file for every selected FSM. For FSMs with the |
| 'fsm_export' attribute set, the attribute value is used as filename, otherwise |
| the module and cell name is used as filename. If the parameter '-o' is given, |
| the first exported FSM is written to the specified filename. This overwrites |
| the setting as specified with the 'fsm_export' attribute. All other FSMs are |
| exported to the default name as mentioned above. |
| |
| -noauto |
| only export FSMs that have the 'fsm_export' attribute set |
| |
| -o filename |
| filename of the first exported FSM |
| |
| -origenc |
| use binary state encoding as state names instead of s0, s1, ... |
| \end{lstlisting} |
| |
| \section{fsm\_extract -- extracting FSMs in design} |
| \label{cmd:fsm_extract} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_extract [selection] |
| |
| This pass operates on all signals marked as FSM state signals using the |
| 'fsm_encoding' attribute. It consumes the logic that creates the state signal |
| and uses the state signal to generate control signal and replaces it with an |
| FSM cell. |
| |
| The generated FSM cell still generates the original state signal with its |
| original encoding. The 'fsm_opt' pass can be used in combination with the |
| 'opt_clean' pass to eliminate this signal. |
| \end{lstlisting} |
| |
| \section{fsm\_info -- print information on finite state machines} |
| \label{cmd:fsm_info} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_info [selection] |
| |
| This pass dumps all internal information on FSM cells. It can be useful for |
| analyzing the synthesis process and is called automatically by the 'fsm' |
| pass so that this information is included in the synthesis log file. |
| \end{lstlisting} |
| |
| \section{fsm\_map -- mapping FSMs to basic logic} |
| \label{cmd:fsm_map} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_map [selection] |
| |
| This pass translates FSM cells to flip-flops and logic. |
| \end{lstlisting} |
| |
| \section{fsm\_opt -- optimize finite state machines} |
| \label{cmd:fsm_opt} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_opt [selection] |
| |
| This pass optimizes FSM cells. It detects which output signals are actually |
| not used and removes them from the FSM. This pass is usually used in |
| combination with the 'opt_clean' pass (see also 'help fsm'). |
| \end{lstlisting} |
| |
| \section{fsm\_recode -- recoding finite state machines} |
| \label{cmd:fsm_recode} |
| \begin{lstlisting}[numbers=left,frame=single] |
| fsm_recode [options] [selection] |
| |
| This pass reassign the state encodings for FSM cells. At the moment only |
| one-hot encoding and binary encoding is supported. |
| -encoding <type> |
| specify the encoding scheme used for FSMs without the |
| 'fsm_encoding' attribute or with the attribute set to `auto'. |
| |
| -fm_set_fsm_file <file> |
| generate a file containing the mapping from old to new FSM encoding |
| in form of Synopsys Formality set_fsm_* commands. |
| |
| -encfile <file> |
| write the mappings from old to new FSM encoding to a file in the |
| following format: |
| |
| .fsm <module_name> <state_signal> |
| .map <old_bitpattern> <new_bitpattern> |
| \end{lstlisting} |
| |
| \section{greenpak4\_dffinv -- merge greenpak4 inverters and DFF/latches} |
| \label{cmd:greenpak4_dffinv} |
| \begin{lstlisting}[numbers=left,frame=single] |
| greenpak4_dffinv [options] [selection] |
| |
| Merge GP_INV cells with GP_DFF* and GP_DLATCH* cells. |
| \end{lstlisting} |
| |
| \section{help -- display help messages} |
| \label{cmd:help} |
| \begin{lstlisting}[numbers=left,frame=single] |
| help ................ list all commands |
| help <command> ...... print help message for given command |
| help -all ........... print complete command reference |
| |
| help -cells .......... list all cell types |
| help <celltype> ..... print help message for given cell type |
| help <celltype>+ .... print verilog code for given cell type |
| \end{lstlisting} |
| |
| \section{hierarchy -- check, expand and clean up design hierarchy} |
| \label{cmd:hierarchy} |
| \begin{lstlisting}[numbers=left,frame=single] |
| hierarchy [-check] [-top <module>] |
| hierarchy -generate <cell-types> <port-decls> |
| |
| In parametric designs, a module might exists in several variations with |
| different parameter values. This pass looks at all modules in the current |
| design an re-runs the language frontends for the parametric modules as |
| needed. |
| |
| -check |
| also check the design hierarchy. this generates an error when |
| an unknown module is used as cell type. |
| |
| -simcheck |
| like -check, but also thow an error if blackbox modules are |
| instantiated, and throw an error if the design has no top module |
| |
| -purge_lib |
| by default the hierarchy command will not remove library (blackbox) |
| modules. use this option to also remove unused blackbox modules. |
| |
| -libdir <directory> |
| search for files named <module_name>.v in the specified directory |
| for unknown modules and automatically run read_verilog for each |
| unknown module. |
| |
| -keep_positionals |
| per default this pass also converts positional arguments in cells |
| to arguments using port names. this option disables this behavior. |
| |
| -keep_portwidths |
| per default this pass adjusts the port width on cells that are |
| module instances when the width does not match the module port. this |
| option disables this behavior. |
| |
| -nokeep_asserts |
| per default this pass sets the "keep" attribute on all modules |
| that directly or indirectly contain one or more $assert cells. this |
| option disables this behavior. |
| |
| -top <module> |
| use the specified top module to built a design hierarchy. modules |
| outside this tree (unused modules) are removed. |
| |
| when the -top option is used, the 'top' attribute will be set on the |
| specified top module. otherwise a module with the 'top' attribute set |
| will implicitly be used as top module, if such a module exists. |
| |
| -auto-top |
| automatically determine the top of the design hierarchy and mark it. |
| |
| In -generate mode this pass generates blackbox modules for the given cell |
| types (wildcards supported). For this the design is searched for cells that |
| match the given types and then the given port declarations are used to |
| determine the direction of the ports. The syntax for a port declaration is: |
| |
| {i|o|io}[@<num>]:<portname> |
| |
| Input ports are specified with the 'i' prefix, output ports with the 'o' |
| prefix and inout ports with the 'io' prefix. The optional <num> specifies |
| the position of the port in the parameter list (needed when instantiated |
| using positional arguments). When <num> is not specified, the <portname> can |
| also contain wildcard characters. |
| |
| This pass ignores the current selection and always operates on all modules |
| in the current design. |
| \end{lstlisting} |
| |
| \section{hilomap -- technology mapping of constant hi- and/or lo-drivers} |
| \label{cmd:hilomap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| hilomap [options] [selection] |
| |
| Map constants to 'tielo' and 'tiehi' driver cells. |
| |
| -hicell <celltype> <portname> |
| Replace constant hi bits with this cell. |
| |
| -locell <celltype> <portname> |
| Replace constant lo bits with this cell. |
| |
| -singleton |
| Create only one hi/lo cell and connect all constant bits |
| to that cell. Per default a separate cell is created for |
| each constant bit. |
| \end{lstlisting} |
| |
| \section{history -- show last interactive commands} |
| \label{cmd:history} |
| \begin{lstlisting}[numbers=left,frame=single] |
| history |
| |
| This command prints all commands in the shell history buffer. This are |
| all commands executed in an interactive session, but not the commands |
| from executed scripts. |
| \end{lstlisting} |
| |
| \section{ice40\_ffinit -- iCE40: handle FF init values} |
| \label{cmd:ice40_ffinit} |
| \begin{lstlisting}[numbers=left,frame=single] |
| ice40_ffinit [options] [selection] |
| |
| Remove zero init values for FF output signals. Add inverters to implement |
| nonzero init values. |
| \end{lstlisting} |
| |
| \section{ice40\_ffssr -- iCE40: merge synchronous set/reset into FF cells} |
| \label{cmd:ice40_ffssr} |
| \begin{lstlisting}[numbers=left,frame=single] |
| ice40_ffssr [options] [selection] |
| |
| Merge synchronous set/reset $_MUX_ cells into iCE40 FFs. |
| \end{lstlisting} |
| |
| \section{ice40\_opt -- iCE40: perform simple optimizations} |
| \label{cmd:ice40_opt} |
| \begin{lstlisting}[numbers=left,frame=single] |
| ice40_opt [options] [selection] |
| |
| This command executes the following script: |
| |
| do |
| <ice40 specific optimizations> |
| opt_expr -mux_undef -undriven [-full] |
| opt_merge |
| opt_rmdff |
| opt_clean |
| while <changed design> |
| |
| When called with the option -unlut, this command will transform all already |
| mapped SB_LUT4 cells back to logic. |
| \end{lstlisting} |
| |
| \section{insbuf -- insert buffer cells for connected wires} |
| \label{cmd:insbuf} |
| \begin{lstlisting}[numbers=left,frame=single] |
| insbuf [options] [selection] |
| |
| Insert buffer cells into the design for directly connected wires. |
| |
| -buf <celltype> <in-portname> <out-portname> |
| Use the given cell type instead of $_BUF_. (Notice that the next |
| call to "clean" will remove all $_BUF_ in the design.) |
| \end{lstlisting} |
| |
| \section{iopadmap -- technology mapping of i/o pads (or buffers)} |
| \label{cmd:iopadmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| iopadmap [options] [selection] |
| |
| Map module inputs/outputs to PAD cells from a library. This pass |
| can only map to very simple PAD cells. Use 'techmap' to further map |
| the resulting cells to more sophisticated PAD cells. |
| |
| -inpad <celltype> <portname>[:<portname>] |
| Map module input ports to the given cell type with the |
| given output port name. if a 2nd portname is given, the |
| signal is passed through the pad call, using the 2nd |
| portname as the port facing the module port. |
| |
| -outpad <celltype> <portname>[:<portname>] |
| -inoutpad <celltype> <portname>[:<portname>] |
| Similar to -inpad, but for output and inout ports. |
| |
| -toutpad <celltype> <portname>:<portname>[:<portname>] |
| Merges $_TBUF_ cells into the output pad cell. This takes precedence |
| over the other -outpad cell. The first portname is the enable input |
| of the tristate driver. |
| |
| -tinoutpad <celltype> <portname>:<portname>:<portname>[:<portname>] |
| Merges $_TBUF_ cells into the inout pad cell. This takes precedence |
| over the other -inoutpad cell. The first portname is the enable input |
| of the tristate driver and the 2nd portname is the internal output |
| buffering the external signal. |
| |
| -widthparam <param_name> |
| Use the specified parameter name to set the port width. |
| |
| -nameparam <param_name> |
| Use the specified parameter to set the port name. |
| |
| -bits |
| create individual bit-wide buffers even for ports that |
| are wider. (the default behavior is to create word-wide |
| buffers using -widthparam to set the word size on the cell.) |
| |
| Tristate PADS (-toutpad, -tinoutpad) always operate in -bits mode. |
| \end{lstlisting} |
| |
| \section{json -- write design in JSON format} |
| \label{cmd:json} |
| \begin{lstlisting}[numbers=left,frame=single] |
| json [options] [selection] |
| |
| Write a JSON netlist of all selected objects. |
| |
| -o <filename> |
| write to the specified file. |
| |
| -aig |
| also include AIG models for the different gate types |
| |
| See 'help write_json' for a description of the JSON format used. |
| \end{lstlisting} |
| |
| \section{log -- print text and log files} |
| \label{cmd:log} |
| \begin{lstlisting}[numbers=left,frame=single] |
| log string |
| |
| Print the given string to the screen and/or the log file. This is useful for TCL |
| scripts, because the TCL command "puts" only goes to stdout but not to |
| logfiles. |
| |
| -stdout |
| Print the output to stdout too. This is useful when all Yosys is executed |
| with a script and the -q (quiet operation) argument to notify the user. |
| |
| -stderr |
| Print the output to stderr too. |
| |
| -nolog |
| Don't use the internal log() command. Use either -stdout or -stderr, |
| otherwise no output will be generated at all. |
| |
| -n |
| do not append a newline |
| \end{lstlisting} |
| |
| \section{ls -- list modules or objects in modules} |
| \label{cmd:ls} |
| \begin{lstlisting}[numbers=left,frame=single] |
| ls [selection] |
| |
| When no active module is selected, this prints a list of modules. |
| |
| When an active module is selected, this prints a list of objects in the module. |
| \end{lstlisting} |
| |
| \section{ltp -- print longest topological path} |
| \label{cmd:ltp} |
| \begin{lstlisting}[numbers=left,frame=single] |
| ltp [options] [selection] |
| |
| This command prints the longest topological path in the design. (Only considers |
| paths within a single module, so the design must be flattened.) |
| |
| -noff |
| automatically exclude FF cell types |
| \end{lstlisting} |
| |
| \section{lut2mux -- convert \$lut to \$\_MUX\_} |
| \label{cmd:lut2mux} |
| \begin{lstlisting}[numbers=left,frame=single] |
| lut2mux [options] [selection] |
| |
| This pass converts $lut cells to $_MUX_ gates. |
| \end{lstlisting} |
| |
| \section{maccmap -- mapping macc cells} |
| \label{cmd:maccmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| maccmap [-unmap] [selection] |
| |
| This pass maps $macc cells to yosys $fa and $alu cells. When the -unmap option |
| is used then the $macc cell is mapped to $add, $sub, etc. cells instead. |
| \end{lstlisting} |
| |
| \section{memory -- translate memories to basic cells} |
| \label{cmd:memory} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory [-nomap] [-nordff] [-memx] [-bram <bram_rules>] [selection] |
| |
| This pass calls all the other memory_* passes in a useful order: |
| |
| memory_dff [-nordff] (-memx implies -nordff) |
| opt_clean |
| memory_share |
| opt_clean |
| memory_memx (when called with -memx) |
| memory_collect |
| memory_bram -rules <bram_rules> (when called with -bram) |
| memory_map (skipped if called with -nomap) |
| |
| This converts memories to word-wide DFFs and address decoders |
| or multiport memory blocks if called with the -nomap option. |
| \end{lstlisting} |
| |
| \section{memory\_bram -- map memories to block rams} |
| \label{cmd:memory_bram} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_bram -rules <rule_file> [selection] |
| |
| This pass converts the multi-port $mem memory cells into block ram instances. |
| The given rules file describes the available resources and how they should be |
| used. |
| |
| The rules file contains a set of block ram description and a sequence of match |
| rules. A block ram description looks like this: |
| |
| bram RAMB1024X32 # name of BRAM cell |
| init 1 # set to '1' if BRAM can be initialized |
| abits 10 # number of address bits |
| dbits 32 # number of data bits |
| groups 2 # number of port groups |
| ports 1 1 # number of ports in each group |
| wrmode 1 0 # set to '1' if this groups is write ports |
| enable 4 1 # number of enable bits |
| transp 0 2 # transparent (for read ports) |
| clocks 1 2 # clock configuration |
| clkpol 2 2 # clock polarity configuration |
| endbram |
| |
| For the option 'transp' the value 0 means non-transparent, 1 means transparent |
| and a value greater than 1 means configurable. All groups with the same |
| value greater than 1 share the same configuration bit. |
| |
| For the option 'clocks' the value 0 means non-clocked, and a value greater |
| than 0 means clocked. All groups with the same value share the same clock |
| signal. |
| |
| For the option 'clkpol' the value 0 means negative edge, 1 means positive edge |
| and a value greater than 1 means configurable. All groups with the same value |
| greater than 1 share the same configuration bit. |
| |
| Using the same bram name in different bram blocks will create different variants |
| of the bram. Verilog configuration parameters for the bram are created as needed. |
| |
| It is also possible to create variants by repeating statements in the bram block |
| and appending '@<label>' to the individual statements. |
| |
| A match rule looks like this: |
| |
| match RAMB1024X32 |
| max waste 16384 # only use this bram if <= 16k ram bits are unused |
| min efficiency 80 # only use this bram if efficiency is at least 80% |
| endmatch |
| |
| It is possible to match against the following values with min/max rules: |
| |
| words ........ number of words in memory in design |
| abits ........ number of address bits on memory in design |
| dbits ........ number of data bits on memory in design |
| wports ....... number of write ports on memory in design |
| rports ....... number of read ports on memory in design |
| ports ........ number of ports on memory in design |
| bits ......... number of bits in memory in design |
| dups .......... number of duplications for more read ports |
| |
| awaste ....... number of unused address slots for this match |
| dwaste ....... number of unused data bits for this match |
| bwaste ....... number of unused bram bits for this match |
| waste ........ total number of unused bram bits (bwaste*dups) |
| efficiency ... total percentage of used and non-duplicated bits |
| |
| acells ....... number of cells in 'address-direction' |
| dcells ....... number of cells in 'data-direction' |
| cells ........ total number of cells (acells*dcells*dups) |
| |
| The interface for the created bram instances is derived from the bram |
| description. Use 'techmap' to convert the created bram instances into |
| instances of the actual bram cells of your target architecture. |
| |
| A match containing the command 'or_next_if_better' is only used if it |
| has a higher efficiency than the next match (and the one after that if |
| the next also has 'or_next_if_better' set, and so forth). |
| |
| A match containing the command 'make_transp' will add external circuitry |
| to simulate 'transparent read', if necessary. |
| |
| A match containing the command 'make_outreg' will add external flip-flops |
| to implement synchronous read ports, if necessary. |
| |
| A match containing the command 'shuffle_enable A' will re-organize |
| the data bits to accommodate the enable pattern of port A. |
| \end{lstlisting} |
| |
| \section{memory\_collect -- creating multi-port memory cells} |
| \label{cmd:memory_collect} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_collect [selection] |
| |
| This pass collects memories and memory ports and creates generic multiport |
| memory cells. |
| \end{lstlisting} |
| |
| \section{memory\_dff -- merge input/output DFFs into memories} |
| \label{cmd:memory_dff} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_dff [options] [selection] |
| |
| This pass detects DFFs at memory ports and merges them into the memory port. |
| I.e. it consumes an asynchronous memory port and the flip-flops at its |
| interface and yields a synchronous memory port. |
| |
| -nordfff |
| do not merge registers on read ports |
| \end{lstlisting} |
| |
| \section{memory\_map -- translate multiport memories to basic cells} |
| \label{cmd:memory_map} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_map [selection] |
| |
| This pass converts multiport memory cells as generated by the memory_collect |
| pass to word-wide DFFs and address decoders. |
| \end{lstlisting} |
| |
| \section{memory\_memx -- emulate vlog sim behavior for mem ports} |
| \label{cmd:memory_memx} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_memx [selection] |
| |
| This pass adds additional circuitry that emulates the Verilog simulation |
| behavior for out-of-bounds memory reads and writes. |
| \end{lstlisting} |
| |
| \section{memory\_nordff -- extract read port FFs from memories} |
| \label{cmd:memory_nordff} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_nordff [options] [selection] |
| |
| This pass extracts FFs from memory read ports. This results in a netlist |
| similar to what one would get from calling memory_dff with -nordff. |
| \end{lstlisting} |
| |
| \section{memory\_share -- consolidate memory ports} |
| \label{cmd:memory_share} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_share [selection] |
| |
| This pass merges share-able memory ports into single memory ports. |
| |
| The following methods are used to consolidate the number of memory ports: |
| |
| - When write ports are connected to async read ports accessing the same |
| address, then this feedback path is converted to a write port with |
| byte/part enable signals. |
| |
| - When multiple write ports access the same address then this is converted |
| to a single write port with a more complex data and/or enable logic path. |
| |
| - When multiple write ports are never accessed at the same time (a SAT |
| solver is used to determine this), then the ports are merged into a single |
| write port. |
| |
| Note that in addition to the algorithms implemented in this pass, the $memrd |
| and $memwr cells are also subject to generic resource sharing passes (and other |
| optimizations) such as "share" and "opt_merge". |
| \end{lstlisting} |
| |
| \section{memory\_unpack -- unpack multi-port memory cells} |
| \label{cmd:memory_unpack} |
| \begin{lstlisting}[numbers=left,frame=single] |
| memory_unpack [selection] |
| |
| This pass converts the multi-port $mem memory cells into individual $memrd and |
| $memwr cells. It is the counterpart to the memory_collect pass. |
| \end{lstlisting} |
| |
| \section{miter -- automatically create a miter circuit} |
| \label{cmd:miter} |
| \begin{lstlisting}[numbers=left,frame=single] |
| miter -equiv [options] gold_name gate_name miter_name |
| |
| Creates a miter circuit for equivalence checking. The gold- and gate- modules |
| must have the same interfaces. The miter circuit will have all inputs of the |
| two source modules, prefixed with 'in_'. The miter circuit has a 'trigger' |
| output that goes high if an output mismatch between the two source modules is |
| detected. |
| |
| -ignore_gold_x |
| a undef (x) bit in the gold module output will match any value in |
| the gate module output. |
| |
| -make_outputs |
| also route the gold- and gate-outputs to 'gold_*' and 'gate_*' outputs |
| on the miter circuit. |
| |
| -make_outcmp |
| also create a cmp_* output for each gold/gate output pair. |
| |
| -make_assert |
| also create an 'assert' cell that checks if trigger is always low. |
| |
| -flatten |
| call 'flatten; opt_expr -keepdc -undriven;;' on the miter circuit. |
| |
| |
| miter -assert [options] module [miter_name] |
| |
| Creates a miter circuit for property checking. All input ports are kept, |
| output ports are discarded. An additional output 'trigger' is created that |
| goes high when an assert is violated. Without a miter_name, the existing |
| module is modified. |
| |
| -make_outputs |
| keep module output ports. |
| |
| -flatten |
| call 'flatten; opt_expr -keepdc -undriven;;' on the miter circuit. |
| \end{lstlisting} |
| |
| \section{muxcover -- cover trees of MUX cells with wider MUXes} |
| \label{cmd:muxcover} |
| \begin{lstlisting}[numbers=left,frame=single] |
| muxcover [options] [selection] |
| |
| Cover trees of $_MUX_ cells with $_MUX{4,8,16}_ cells |
| |
| -mux4, -mux8, -mux16 |
| Use the specified types of MUXes. If none of those options are used, |
| the effect is the same as if all of them where used. |
| |
| -nodecode |
| Do not insert decoder logic. This reduces the number of possible |
| substitutions, but guarantees that the resulting circuit is not |
| less efficient than the original circuit. |
| \end{lstlisting} |
| |
| \section{nlutmap -- map to LUTs of different sizes} |
| \label{cmd:nlutmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| nlutmap [options] [selection] |
| |
| This pass uses successive calls to 'abc' to map to an architecture. That |
| provides a small number of differently sized LUTs. |
| |
| -luts N_1,N_2,N_3,... |
| The number of LUTs with 1, 2, 3, ... inputs that are |
| available in the target architecture. |
| |
| -assert |
| Create an error if not all logic can be mapped |
| |
| Excess logic that does not fit into the specified LUTs is mapped back |
| to generic logic gates ($_AND_, etc.). |
| \end{lstlisting} |
| |
| \section{opt -- perform simple optimizations} |
| \label{cmd:opt} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt [options] [selection] |
| |
| This pass calls all the other opt_* passes in a useful order. This performs |
| a series of trivial optimizations and cleanups. This pass executes the other |
| passes in the following order: |
| |
| opt_expr [-mux_undef] [-mux_bool] [-undriven] [-clkinv] [-fine] [-full] [-keepdc] |
| opt_merge [-share_all] -nomux |
| |
| do |
| opt_muxtree |
| opt_reduce [-fine] [-full] |
| opt_merge [-share_all] |
| opt_rmdff [-keepdc] |
| opt_clean [-purge] |
| opt_expr [-mux_undef] [-mux_bool] [-undriven] [-clkinv] [-fine] [-full] [-keepdc] |
| while <changed design> |
| |
| When called with -fast the following script is used instead: |
| |
| do |
| opt_expr [-mux_undef] [-mux_bool] [-undriven] [-clkinv] [-fine] [-full] [-keepdc] |
| opt_merge [-share_all] |
| opt_rmdff [-keepdc] |
| opt_clean [-purge] |
| while <changed design in opt_rmdff> |
| |
| Note: Options in square brackets (such as [-keepdc]) are passed through to |
| the opt_* commands when given to 'opt'. |
| \end{lstlisting} |
| |
| \section{opt\_clean -- remove unused cells and wires} |
| \label{cmd:opt_clean} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt_clean [options] [selection] |
| |
| This pass identifies wires and cells that are unused and removes them. Other |
| passes often remove cells but leave the wires in the design or reconnect the |
| wires but leave the old cells in the design. This pass can be used to clean up |
| after the passes that do the actual work. |
| |
| This pass only operates on completely selected modules without processes. |
| |
| -purge |
| also remove internal nets if they have a public name |
| \end{lstlisting} |
| |
| \section{opt\_demorgan -- Optimize reductions with DeMorgan equivalents} |
| \label{cmd:opt_demorgan} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt_demorgan [selection] |
| |
| This pass pushes inverters through $reduce_* cells if this will reduce the |
| overall gate count of the circuit |
| \end{lstlisting} |
| |
| \section{opt\_expr -- perform const folding and simple expression rewriting} |
| \label{cmd:opt_expr} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt_expr [options] [selection] |
| |
| This pass performs const folding on internal cell types with constant inputs. |
| It also performs some simple expression rewritring. |
| |
| -mux_undef |
| remove 'undef' inputs from $mux, $pmux and $_MUX_ cells |
| |
| -mux_bool |
| replace $mux cells with inverters or buffers when possible |
| |
| -undriven |
| replace undriven nets with undef (x) constants |
| |
| -clkinv |
| optimize clock inverters by changing FF types |
| |
| -fine |
| perform fine-grain optimizations |
| |
| -full |
| alias for -mux_undef -mux_bool -undriven -fine |
| |
| -keepdc |
| some optimizations change the behavior of the circuit with respect to |
| don't-care bits. for example in 'a+0' a single x-bit in 'a' will cause |
| all result bits to be set to x. this behavior changes when 'a+0' is |
| replaced by 'a'. the -keepdc option disables all such optimizations. |
| \end{lstlisting} |
| |
| \section{opt\_merge -- consolidate identical cells} |
| \label{cmd:opt_merge} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt_merge [options] [selection] |
| |
| This pass identifies cells with identical type and input signals. Such cells |
| are then merged to one cell. |
| |
| -nomux |
| Do not merge MUX cells. |
| |
| -share_all |
| Operate on all cell types, not just built-in types. |
| \end{lstlisting} |
| |
| \section{opt\_muxtree -- eliminate dead trees in multiplexer trees} |
| \label{cmd:opt_muxtree} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt_muxtree [selection] |
| |
| This pass analyzes the control signals for the multiplexer trees in the design |
| and identifies inputs that can never be active. It then removes this dead |
| branches from the multiplexer trees. |
| |
| This pass only operates on completely selected modules without processes. |
| \end{lstlisting} |
| |
| \section{opt\_reduce -- simplify large MUXes and AND/OR gates} |
| \label{cmd:opt_reduce} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt_reduce [options] [selection] |
| |
| This pass performs two interlinked optimizations: |
| |
| 1. it consolidates trees of large AND gates or OR gates and eliminates |
| duplicated inputs. |
| |
| 2. it identifies duplicated inputs to MUXes and replaces them with a single |
| input with the original control signals OR'ed together. |
| |
| -fine |
| perform fine-grain optimizations |
| |
| -full |
| alias for -fine |
| \end{lstlisting} |
| |
| \section{opt\_rmdff -- remove DFFs with constant inputs} |
| \label{cmd:opt_rmdff} |
| \begin{lstlisting}[numbers=left,frame=single] |
| opt_rmdff [-keepdc] [selection] |
| |
| This pass identifies flip-flops with constant inputs and replaces them with |
| a constant driver. |
| \end{lstlisting} |
| |
| \section{plugin -- load and list loaded plugins} |
| \label{cmd:plugin} |
| \begin{lstlisting}[numbers=left,frame=single] |
| plugin [options] |
| |
| Load and list loaded plugins. |
| |
| -i <plugin_filename> |
| Load (install) the specified plugin. |
| |
| -a <alias_name> |
| Register the specified alias name for the loaded plugin |
| |
| -l |
| List loaded plugins |
| \end{lstlisting} |
| |
| \section{pmuxtree -- transform \$pmux cells to trees of \$mux cells} |
| \label{cmd:pmuxtree} |
| \begin{lstlisting}[numbers=left,frame=single] |
| pmuxtree [options] [selection] |
| |
| This pass transforms $pmux cells to a trees of $mux cells. |
| \end{lstlisting} |
| |
| \section{prep -- generic synthesis script} |
| \label{cmd:prep} |
| \begin{lstlisting}[numbers=left,frame=single] |
| prep [options] |
| |
| This command runs a conservative RTL synthesis. A typical application for this |
| is the preparation stage of a verification flow. This command does not operate |
| on partly selected designs. |
| |
| -top <module> |
| use the specified module as top module (default='top') |
| |
| -auto-top |
| automatically determine the top of the design hierarchy |
| |
| -flatten |
| flatten the design before synthesis. this will pass '-auto-top' to |
| 'hierarchy' if no top module is specified. |
| |
| -ifx |
| passed to 'proc'. uses verilog simulation behavior for verilog if/case |
| undef handling. this also prevents 'wreduce' from being run. |
| |
| -memx |
| simulate verilog simulation behavior for out-of-bounds memory accesses |
| using the 'memory_memx' pass. |
| |
| -nomem |
| do not run any of the memory_* passes |
| |
| -rdff |
| do not pass -nordff to 'memory_dff'. This enables merging of FFs into |
| memory read ports. |
| |
| -nokeepdc |
| do not call opt_* with -keepdc |
| |
| -run <from_label>[:<to_label>] |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| hierarchy -check [-top <top> | -auto-top] |
| |
| coarse: |
| proc [-ifx] |
| flatten (if -flatten) |
| opt_expr -keepdc |
| opt_clean |
| check |
| opt -keepdc |
| wreduce [-memx] |
| memory_dff [-nordff] |
| memory_memx (if -memx) |
| opt_clean |
| memory_collect |
| opt -keepdc -fast |
| |
| check: |
| stat |
| check |
| \end{lstlisting} |
| |
| \section{proc -- translate processes to netlists} |
| \label{cmd:proc} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc [options] [selection] |
| |
| This pass calls all the other proc_* passes in the most common order. |
| |
| proc_clean |
| proc_rmdead |
| proc_init |
| proc_arst |
| proc_mux |
| proc_dlatch |
| proc_dff |
| proc_clean |
| |
| This replaces the processes in the design with multiplexers, |
| flip-flops and latches. |
| |
| The following options are supported: |
| |
| -global_arst [!]<netname> |
| This option is passed through to proc_arst. |
| |
| -ifx |
| This option is passed through to proc_mux. proc_rmdead is not |
| executed in -ifx mode. |
| \end{lstlisting} |
| |
| \section{proc\_arst -- detect asynchronous resets} |
| \label{cmd:proc_arst} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc_arst [-global_arst [!]<netname>] [selection] |
| |
| This pass identifies asynchronous resets in the processes and converts them |
| to a different internal representation that is suitable for generating |
| flip-flop cells with asynchronous resets. |
| |
| -global_arst [!]<netname> |
| In modules that have a net with the given name, use this net as async |
| reset for registers that have been assign initial values in their |
| declaration ('reg foobar = constant_value;'). Use the '!' modifier for |
| active low reset signals. Note: the frontend stores the default value |
| in the 'init' attribute on the net. |
| \end{lstlisting} |
| |
| \section{proc\_clean -- remove empty parts of processes} |
| \label{cmd:proc_clean} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc_clean [selection] |
| |
| This pass removes empty parts of processes and ultimately removes a process |
| if it contains only empty structures. |
| \end{lstlisting} |
| |
| \section{proc\_dff -- extract flip-flops from processes} |
| \label{cmd:proc_dff} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc_dff [selection] |
| |
| This pass identifies flip-flops in the processes and converts them to |
| d-type flip-flop cells. |
| \end{lstlisting} |
| |
| \section{proc\_dlatch -- extract latches from processes} |
| \label{cmd:proc_dlatch} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc_dlatch [selection] |
| |
| This pass identifies latches in the processes and converts them to |
| d-type latches. |
| \end{lstlisting} |
| |
| \section{proc\_init -- convert initial block to init attributes} |
| \label{cmd:proc_init} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc_init [selection] |
| |
| This pass extracts the 'init' actions from processes (generated from Verilog |
| 'initial' blocks) and sets the initial value to the 'init' attribute on the |
| respective wire. |
| \end{lstlisting} |
| |
| \section{proc\_mux -- convert decision trees to multiplexers} |
| \label{cmd:proc_mux} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc_mux [options] [selection] |
| |
| This pass converts the decision trees in processes (originating from if-else |
| and case statements) to trees of multiplexer cells. |
| |
| -ifx |
| Use Verilog simulation behavior with respect to undef values in |
| 'case' expressions and 'if' conditions. |
| \end{lstlisting} |
| |
| \section{proc\_rmdead -- eliminate dead trees in decision trees} |
| \label{cmd:proc_rmdead} |
| \begin{lstlisting}[numbers=left,frame=single] |
| proc_rmdead [selection] |
| |
| This pass identifies unreachable branches in decision trees and removes them. |
| \end{lstlisting} |
| |
| \section{qwp -- quadratic wirelength placer} |
| \label{cmd:qwp} |
| \begin{lstlisting}[numbers=left,frame=single] |
| qwp [options] [selection] |
| |
| This command runs quadratic wirelength placement on the selected modules and |
| annotates the cells in the design with 'qwp_position' attributes. |
| |
| -ltr |
| Add left-to-right constraints: constrain all inputs on the left border |
| outputs to the right border. |
| |
| -alpha |
| Add constraints for inputs/outputs to be placed in alphanumerical |
| order along the y-axis (top-to-bottom). |
| |
| -grid N |
| Number of grid divisions in x- and y-direction. (default=16) |
| |
| -dump <html_file_name> |
| Dump a protocol of the placement algorithm to the html file. |
| |
| -v |
| Verbose solver output for profiling or debugging |
| |
| Note: This implementation of a quadratic wirelength placer uses exact |
| dense matrix operations. It is only a toy-placer for small circuits. |
| \end{lstlisting} |
| |
| \section{read -- load HDL designs} |
| \label{cmd:read} |
| \begin{lstlisting}[numbers=left,frame=single] |
| read {-vlog95|-vlog2k|-sv2005|-sv2009|-sv2012|-sv|-formal} <verilog-file>.. |
| |
| Load the specified Verilog/SystemVerilog files. (Full SystemVerilog support |
| is only available via Verific.) |
| |
| Additional -D<macro>[=<value>] options may be added after the option indicating |
| the language version (and before file names) to set additional verilog defines. |
| |
| |
| read {-vhdl87|-vhdl93|-vhdl2k|-vhdl2008|-vhdl} <vhdl-file>.. |
| |
| Load the specified VHDL files. (Requires Verific.) |
| |
| |
| read -define <macro>[=<value>].. |
| |
| Set global Verilog/SystemVerilog defines. |
| |
| |
| read -undef <macro>.. |
| |
| Unset global Verilog/SystemVerilog defines. |
| |
| |
| read -incdir <directory> |
| |
| Add directory to global Verilog/SystemVerilog include directories. |
| \end{lstlisting} |
| |
| \section{read\_blif -- read BLIF file} |
| \label{cmd:read_blif} |
| \begin{lstlisting}[numbers=left,frame=single] |
| read_blif [filename] |
| |
| Load modules from a BLIF file into the current design. |
| |
| -sop |
| Create $sop cells instead of $lut cells |
| |
| -wideports |
| Merge ports that match the pattern 'name[int]' into a single |
| multi-bit port 'name'. |
| \end{lstlisting} |
| |
| \section{read\_ilang -- read modules from ilang file} |
| \label{cmd:read_ilang} |
| \begin{lstlisting}[numbers=left,frame=single] |
| read_ilang [filename] |
| |
| Load modules from an ilang file to the current design. (ilang is a text |
| representation of a design in yosys's internal format.) |
| \end{lstlisting} |
| |
| \section{read\_json -- read JSON file} |
| \label{cmd:read_json} |
| \begin{lstlisting}[numbers=left,frame=single] |
| read_json [filename] |
| |
| Load modules from a JSON file into the current design See "help write_json" |
| for a description of the file format. |
| \end{lstlisting} |
| |
| \section{read\_liberty -- read cells from liberty file} |
| \label{cmd:read_liberty} |
| \begin{lstlisting}[numbers=left,frame=single] |
| read_liberty [filename] |
| |
| Read cells from liberty file as modules into current design. |
| |
| -lib |
| only create empty blackbox modules |
| |
| -nooverwrite |
| ignore re-definitions of modules. (the default behavior is to |
| create an error message if the existing module is not a blackbox |
| module, and overwrite the existing module if it is a blackbox module.) |
| |
| -overwrite |
| overwrite existing modules with the same name |
| |
| -ignore_miss_func |
| ignore cells with missing function specification of outputs |
| |
| -ignore_miss_dir |
| ignore cells with a missing or invalid direction |
| specification on a pin |
| |
| -ignore_miss_data_latch |
| ignore latches with missing data and/or enable pins |
| |
| -setattr <attribute_name> |
| set the specified attribute (to the value 1) on all loaded modules |
| \end{lstlisting} |
| |
| \section{read\_verilog -- read modules from Verilog file} |
| \label{cmd:read_verilog} |
| \begin{lstlisting}[numbers=left,frame=single] |
| read_verilog [options] [filename] |
| |
| Load modules from a Verilog file to the current design. A large subset of |
| Verilog-2005 is supported. |
| |
| -sv |
| enable support for SystemVerilog features. (only a small subset |
| of SystemVerilog is supported) |
| |
| -formal |
| enable support for SystemVerilog assertions and some Yosys extensions |
| replace the implicit -D SYNTHESIS with -D FORMAL |
| |
| -norestrict |
| ignore restrict() assertions |
| |
| -assume-asserts |
| treat all assert() statements like assume() statements |
| |
| -dump_ast1 |
| dump abstract syntax tree (before simplification) |
| |
| -dump_ast2 |
| dump abstract syntax tree (after simplification) |
| |
| -no_dump_ptr |
| do not include hex memory addresses in dump (easier to diff dumps) |
| |
| -dump_vlog |
| dump ast as Verilog code (after simplification) |
| |
| -dump_rtlil |
| dump generated RTLIL netlist |
| |
| -yydebug |
| enable parser debug output |
| |
| -nolatches |
| usually latches are synthesized into logic loops |
| this option prohibits this and sets the output to 'x' |
| in what would be the latches hold condition |
| |
| this behavior can also be achieved by setting the |
| 'nolatches' attribute on the respective module or |
| always block. |
| |
| -nomem2reg |
| under certain conditions memories are converted to registers |
| early during simplification to ensure correct handling of |
| complex corner cases. this option disables this behavior. |
| |
| this can also be achieved by setting the 'nomem2reg' |
| attribute on the respective module or register. |
| |
| This is potentially dangerous. Usually the front-end has good |
| reasons for converting an array to a list of registers. |
| Prohibiting this step will likely result in incorrect synthesis |
| results. |
| |
| -mem2reg |
| always convert memories to registers. this can also be |
| achieved by setting the 'mem2reg' attribute on the respective |
| module or register. |
| |
| -nomeminit |
| do not infer $meminit cells and instead convert initialized |
| memories to registers directly in the front-end. |
| |
| -ppdump |
| dump Verilog code after pre-processor |
| |
| -nopp |
| do not run the pre-processor |
| |
| -nodpi |
| disable DPI-C support |
| |
| -lib |
| only create empty blackbox modules. This implies -DBLACKBOX. |
| |
| -noopt |
| don't perform basic optimizations (such as const folding) in the |
| high-level front-end. |
| |
| -icells |
| interpret cell types starting with '$' as internal cell types |
| |
| -nooverwrite |
| ignore re-definitions of modules. (the default behavior is to |
| create an error message if the existing module is not a black box |
| module, and overwrite the existing module otherwise.) |
| |
| -overwrite |
| overwrite existing modules with the same name |
| |
| -defer |
| only read the abstract syntax tree and defer actual compilation |
| to a later 'hierarchy' command. Useful in cases where the default |
| parameters of modules yield invalid or not synthesizable code. |
| |
| -noautowire |
| make the default of `default_nettype be "none" instead of "wire". |
| |
| -setattr <attribute_name> |
| set the specified attribute (to the value 1) on all loaded modules |
| |
| -Dname[=definition] |
| define the preprocessor symbol 'name' and set its optional value |
| 'definition' |
| |
| -Idir |
| add 'dir' to the directories which are used when searching include |
| files |
| |
| The command 'verilog_defaults' can be used to register default options for |
| subsequent calls to 'read_verilog'. |
| |
| Note that the Verilog frontend does a pretty good job of processing valid |
| verilog input, but has not very good error reporting. It generally is |
| recommended to use a simulator (for example Icarus Verilog) for checking |
| the syntax of the code, rather than to rely on read_verilog for that. |
| |
| Depending on if read_verilog is run in -formal mode, either the macro |
| SYNTHESIS or FORMAL is defined automatically. In addition, read_verilog |
| always defines the macro YOSYS. |
| |
| See the Yosys README file for a list of non-standard Verilog features |
| supported by the Yosys Verilog front-end. |
| \end{lstlisting} |
| |
| \section{rename -- rename object in the design} |
| \label{cmd:rename} |
| \begin{lstlisting}[numbers=left,frame=single] |
| rename old_name new_name |
| |
| Rename the specified object. Note that selection patterns are not supported |
| by this command. |
| |
| |
| rename -enumerate [-pattern <pattern>] [selection] |
| |
| Assign short auto-generated names to all selected wires and cells with private |
| names. The -pattern option can be used to set the pattern for the new names. |
| The character % in the pattern is replaced with a integer number. The default |
| pattern is '_%_'. |
| |
| rename -hide [selection] |
| |
| Assign private names (the ones with $-prefix) to all selected wires and cells |
| with public names. This ignores all selected ports. |
| |
| rename -top new_name |
| |
| Rename top module. |
| \end{lstlisting} |
| |
| \section{rmports -- remove module ports with no connections} |
| \label{cmd:rmports} |
| \begin{lstlisting}[numbers=left,frame=single] |
| rmports [selection] |
| |
| This pass identifies ports in the selected modules which are not used or |
| driven and removes them. |
| \end{lstlisting} |
| |
| \section{sat -- solve a SAT problem in the circuit} |
| \label{cmd:sat} |
| \begin{lstlisting}[numbers=left,frame=single] |
| sat [options] [selection] |
| |
| This command solves a SAT problem defined over the currently selected circuit |
| and additional constraints passed as parameters. |
| |
| -all |
| show all solutions to the problem (this can grow exponentially, use |
| -max <N> instead to get <N> solutions) |
| |
| -max <N> |
| like -all, but limit number of solutions to <N> |
| |
| -enable_undef |
| enable modeling of undef value (aka 'x-bits') |
| this option is implied by -set-def, -set-undef et. cetera |
| |
| -max_undef |
| maximize the number of undef bits in solutions, giving a better |
| picture of which input bits are actually vital to the solution. |
| |
| -set <signal> <value> |
| set the specified signal to the specified value. |
| |
| -set-def <signal> |
| add a constraint that all bits of the given signal must be defined |
| |
| -set-any-undef <signal> |
| add a constraint that at least one bit of the given signal is undefined |
| |
| -set-all-undef <signal> |
| add a constraint that all bits of the given signal are undefined |
| |
| -set-def-inputs |
| add -set-def constraints for all module inputs |
| |
| -show <signal> |
| show the model for the specified signal. if no -show option is |
| passed then a set of signals to be shown is automatically selected. |
| |
| -show-inputs, -show-outputs, -show-ports |
| add all module (input/output) ports to the list of shown signals |
| |
| -show-regs, -show-public, -show-all |
| show all registers, show signals with 'public' names, show all signals |
| |
| -ignore_div_by_zero |
| ignore all solutions that involve a division by zero |
| |
| -ignore_unknown_cells |
| ignore all cells that can not be matched to a SAT model |
| |
| The following options can be used to set up a sequential problem: |
| |
| -seq <N> |
| set up a sequential problem with <N> time steps. The steps will |
| be numbered from 1 to N. |
| |
| note: for large <N> it can be significantly faster to use |
| -tempinduct-baseonly -maxsteps <N> instead of -seq <N>. |
| |
| -set-at <N> <signal> <value> |
| -unset-at <N> <signal> |
| set or unset the specified signal to the specified value in the |
| given timestep. this has priority over a -set for the same signal. |
| |
| -set-assumes |
| set all assumptions provided via $assume cells |
| |
| -set-def-at <N> <signal> |
| -set-any-undef-at <N> <signal> |
| -set-all-undef-at <N> <signal> |
| add undef constraints in the given timestep. |
| |
| -set-init <signal> <value> |
| set the initial value for the register driving the signal to the value |
| |
| -set-init-undef |
| set all initial states (not set using -set-init) to undef |
| |
| -set-init-def |
| do not force a value for the initial state but do not allow undef |
| |
| -set-init-zero |
| set all initial states (not set using -set-init) to zero |
| |
| -dump_vcd <vcd-file-name> |
| dump SAT model (counter example in proof) to VCD file |
| |
| -dump_json <json-file-name> |
| dump SAT model (counter example in proof) to a WaveJSON file. |
| |
| -dump_cnf <cnf-file-name> |
| dump CNF of SAT problem (in DIMACS format). in temporal induction |
| proofs this is the CNF of the first induction step. |
| |
| The following additional options can be used to set up a proof. If also -seq |
| is passed, a temporal induction proof is performed. |
| |
| -tempinduct |
| Perform a temporal induction proof. In a temporal induction proof it is |
| proven that the condition holds forever after the number of time steps |
| specified using -seq. |
| |
| -tempinduct-def |
| Perform a temporal induction proof. Assume an initial state with all |
| registers set to defined values for the induction step. |
| |
| -tempinduct-baseonly |
| Run only the basecase half of temporal induction (requires -maxsteps) |
| |
| -tempinduct-inductonly |
| Run only the induction half of temporal induction |
| |
| -tempinduct-skip <N> |
| Skip the first <N> steps of the induction proof. |
| |
| note: this will assume that the base case holds for <N> steps. |
| this must be proven independently with "-tempinduct-baseonly |
| -maxsteps <N>". Use -initsteps if you just want to set a |
| minimal induction length. |
| |
| -prove <signal> <value> |
| Attempt to proof that <signal> is always <value>. |
| |
| -prove-x <signal> <value> |
| Like -prove, but an undef (x) bit in the lhs matches any value on |
| the right hand side. Useful for equivalence checking. |
| |
| -prove-asserts |
| Prove that all asserts in the design hold. |
| |
| -prove-skip <N> |
| Do not enforce the prove-condition for the first <N> time steps. |
| |
| -maxsteps <N> |
| Set a maximum length for the induction. |
| |
| -initsteps <N> |
| Set initial length for the induction. |
| This will speed up the search of the right induction length |
| for deep induction proofs. |
| |
| -stepsize <N> |
| Increase the size of the induction proof in steps of <N>. |
| This will speed up the search of the right induction length |
| for deep induction proofs. |
| |
| -timeout <N> |
| Maximum number of seconds a single SAT instance may take. |
| |
| -verify |
| Return an error and stop the synthesis script if the proof fails. |
| |
| -verify-no-timeout |
| Like -verify but do not return an error for timeouts. |
| |
| -falsify |
| Return an error and stop the synthesis script if the proof succeeds. |
| |
| -falsify-no-timeout |
| Like -falsify but do not return an error for timeouts. |
| \end{lstlisting} |
| |
| \section{scatter -- add additional intermediate nets} |
| \label{cmd:scatter} |
| \begin{lstlisting}[numbers=left,frame=single] |
| scatter [selection] |
| |
| This command adds additional intermediate nets on all cell ports. This is used |
| for testing the correct use of the SigMap helper in passes. If you don't know |
| what this means: don't worry -- you only need this pass when testing your own |
| extensions to Yosys. |
| |
| Use the opt_clean command to get rid of the additional nets. |
| \end{lstlisting} |
| |
| \section{scc -- detect strongly connected components (logic loops)} |
| \label{cmd:scc} |
| \begin{lstlisting}[numbers=left,frame=single] |
| scc [options] [selection] |
| |
| This command identifies strongly connected components (aka logic loops) in the |
| design. |
| |
| -expect <num> |
| expect to find exactly <num> SSCs. A different number of SSCs will |
| produce an error. |
| |
| -max_depth <num> |
| limit to loops not longer than the specified number of cells. This |
| can e.g. be useful in identifying small local loops in a module that |
| implements one large SCC. |
| |
| -nofeedback |
| do not count cells that have their output fed back into one of their |
| inputs as single-cell scc. |
| |
| -all_cell_types |
| Usually this command only considers internal non-memory cells. With |
| this option set, all cells are considered. For unknown cells all ports |
| are assumed to be bidirectional 'inout' ports. |
| |
| -set_attr <name> <value> |
| set the specified attribute on all cells that are part of a logic |
| loop. the special token {} in the value is replaced with a unique |
| identifier for the logic loop. |
| |
| -select |
| replace the current selection with a selection of all cells and wires |
| that are part of a found logic loop |
| \end{lstlisting} |
| |
| \section{script -- execute commands from script file} |
| \label{cmd:script} |
| \begin{lstlisting}[numbers=left,frame=single] |
| script <filename> [<from_label>:<to_label>] |
| |
| This command executes the yosys commands in the specified file. |
| |
| The 2nd argument can be used to only execute the section of the |
| file between the specified labels. An empty from label is synonymous |
| for the beginning of the file and an empty to label is synonymous |
| for the end of the file. |
| |
| If only one label is specified (without ':') then only the block |
| marked with that label (until the next label) is executed. |
| \end{lstlisting} |
| |
| \section{select -- modify and view the list of selected objects} |
| \label{cmd:select} |
| \begin{lstlisting}[numbers=left,frame=single] |
| select [ -add | -del | -set <name> ] {-read <filename> | <selection>} |
| select [ <assert_option> ] {-read <filename> | <selection>} |
| select [ -list | -write <filename> | -count | -clear ] |
| select -module <modname> |
| |
| Most commands use the list of currently selected objects to determine which part |
| of the design to operate on. This command can be used to modify and view this |
| list of selected objects. |
| |
| Note that many commands support an optional [selection] argument that can be |
| used to YS_OVERRIDE the global selection for the command. The syntax of this |
| optional argument is identical to the syntax of the <selection> argument |
| described here. |
| |
| -add, -del |
| add or remove the given objects to the current selection. |
| without this options the current selection is replaced. |
| |
| -set <name> |
| do not modify the current selection. instead save the new selection |
| under the given name (see @<name> below). to save the current selection, |
| use "select -set <name> %" |
| |
| -assert-none |
| do not modify the current selection. instead assert that the given |
| selection is empty. i.e. produce an error if any object matching the |
| selection is found. |
| |
| -assert-any |
| do not modify the current selection. instead assert that the given |
| selection is non-empty. i.e. produce an error if no object matching |
| the selection is found. |
| |
| -assert-count N |
| do not modify the current selection. instead assert that the given |
| selection contains exactly N objects. |
| |
| -assert-max N |
| do not modify the current selection. instead assert that the given |
| selection contains less than or exactly N objects. |
| |
| -assert-min N |
| do not modify the current selection. instead assert that the given |
| selection contains at least N objects. |
| |
| -list |
| list all objects in the current selection |
| |
| -write <filename> |
| like -list but write the output to the specified file |
| |
| -read <filename> |
| read the specified file (written by -write) |
| |
| -count |
| count all objects in the current selection |
| |
| -clear |
| clear the current selection. this effectively selects the whole |
| design. it also resets the selected module (see -module). use the |
| command 'select *' to select everything but stay in the current module. |
| |
| -none |
| create an empty selection. the current module is unchanged. |
| |
| -module <modname> |
| limit the current scope to the specified module. |
| the difference between this and simply selecting the module |
| is that all object names are interpreted relative to this |
| module after this command until the selection is cleared again. |
| |
| When this command is called without an argument, the current selection |
| is displayed in a compact form (i.e. only the module name when a whole module |
| is selected). |
| |
| The <selection> argument itself is a series of commands for a simple stack |
| machine. Each element on the stack represents a set of selected objects. |
| After this commands have been executed, the union of all remaining sets |
| on the stack is computed and used as selection for the command. |
| |
| Pushing (selecting) object when not in -module mode: |
| |
| <mod_pattern> |
| select the specified module(s) |
| |
| <mod_pattern>/<obj_pattern> |
| select the specified object(s) from the module(s) |
| |
| Pushing (selecting) object when in -module mode: |
| |
| <obj_pattern> |
| select the specified object(s) from the current module |
| |
| A <mod_pattern> can be a module name, wildcard expression (*, ?, [..]) |
| matching module names, or one of the following: |
| |
| A:<pattern>, A:<pattern>=<pattern> |
| all modules with an attribute matching the given pattern |
| in addition to = also <, <=, >=, and > are supported |
| |
| An <obj_pattern> can be an object name, wildcard expression, or one of |
| the following: |
| |
| w:<pattern> |
| all wires with a name matching the given wildcard pattern |
| |
| i:<pattern>, o:<pattern>, x:<pattern> |
| all inputs (i:), outputs (o:) or any ports (x:) with matching names |
| |
| s:<size>, s:<min>:<max> |
| all wires with a matching width |
| |
| m:<pattern> |
| all memories with a name matching the given pattern |
| |
| c:<pattern> |
| all cells with a name matching the given pattern |
| |
| t:<pattern> |
| all cells with a type matching the given pattern |
| |
| p:<pattern> |
| all processes with a name matching the given pattern |
| |
| a:<pattern> |
| all objects with an attribute name matching the given pattern |
| |
| a:<pattern>=<pattern> |
| all objects with a matching attribute name-value-pair. |
| in addition to = also <, <=, >=, and > are supported |
| |
| r:<pattern>, r:<pattern>=<pattern> |
| cells with matching parameters. also with <, <=, >= and >. |
| |
| n:<pattern> |
| all objects with a name matching the given pattern |
| (i.e. 'n:' is optional as it is the default matching rule) |
| |
| @<name> |
| push the selection saved prior with 'select -set <name> ...' |
| |
| The following actions can be performed on the top sets on the stack: |
| |
| % |
| push a copy of the current selection to the stack |
| |
| %% |
| replace the stack with a union of all elements on it |
| |
| %n |
| replace top set with its invert |
| |
| %u |
| replace the two top sets on the stack with their union |
| |
| %i |
| replace the two top sets on the stack with their intersection |
| |
| %d |
| pop the top set from the stack and subtract it from the new top |
| |
| %D |
| like %d but swap the roles of two top sets on the stack |
| |
| %c |
| create a copy of the top set from the stack and push it |
| |
| %x[<num1>|*][.<num2>][:<rule>[:<rule>..]] |
| expand top set <num1> num times according to the specified rules. |
| (i.e. select all cells connected to selected wires and select all |
| wires connected to selected cells) The rules specify which cell |
| ports to use for this. the syntax for a rule is a '-' for exclusion |
| and a '+' for inclusion, followed by an optional comma separated |
| list of cell types followed by an optional comma separated list of |
| cell ports in square brackets. a rule can also be just a cell or wire |
| name that limits the expansion (is included but does not go beyond). |
| select at most <num2> objects. a warning message is printed when this |
| limit is reached. When '*' is used instead of <num1> then the process |
| is repeated until no further object are selected. |
| |
| %ci[<num1>|*][.<num2>][:<rule>[:<rule>..]] |
| %co[<num1>|*][.<num2>][:<rule>[:<rule>..]] |
| similar to %x, but only select input (%ci) or output cones (%co) |
| |
| %xe[...] %cie[...] %coe |
| like %x, %ci, and %co but only consider combinatorial cells |
| |
| %a |
| expand top set by selecting all wires that are (at least in part) |
| aliases for selected wires. |
| |
| %s |
| expand top set by adding all modules that implement cells in selected |
| modules |
| |
| %m |
| expand top set by selecting all modules that contain selected objects |
| |
| %M |
| select modules that implement selected cells |
| |
| %C |
| select cells that implement selected modules |
| |
| %R[<num>] |
| select <num> random objects from top selection (default 1) |
| |
| Example: the following command selects all wires that are connected to a |
| 'GATE' input of a 'SWITCH' cell: |
| |
| select */t:SWITCH %x:+[GATE] */t:SWITCH %d |
| \end{lstlisting} |
| |
| \section{setattr -- set/unset attributes on objects} |
| \label{cmd:setattr} |
| \begin{lstlisting}[numbers=left,frame=single] |
| setattr [ -mod ] [ -set name value | -unset name ]... [selection] |
| |
| Set/unset the given attributes on the selected objects. String values must be |
| passed in double quotes ("). |
| |
| When called with -mod, this command will set and unset attributes on modules |
| instead of objects within modules. |
| \end{lstlisting} |
| |
| \section{setparam -- set/unset parameters on objects} |
| \label{cmd:setparam} |
| \begin{lstlisting}[numbers=left,frame=single] |
| setparam [ -type cell_type ] [ -set name value | -unset name ]... [selection] |
| |
| Set/unset the given parameters on the selected cells. String values must be |
| passed in double quotes ("). |
| |
| The -type option can be used to change the cell type of the selected cells. |
| \end{lstlisting} |
| |
| \section{setundef -- replace undef values with defined constants} |
| \label{cmd:setundef} |
| \begin{lstlisting}[numbers=left,frame=single] |
| setundef [options] [selection] |
| |
| This command replaces undef (x) constants with defined (0/1) constants. |
| |
| -undriven |
| also set undriven nets to constant values |
| |
| -expose |
| also expose undriven nets as inputs (use with -undriven) |
| |
| -zero |
| replace with bits cleared (0) |
| |
| -one |
| replace with bits set (1) |
| |
| -undef |
| replace with undef (x) bits, may be used with -undriven |
| |
| -anyseq |
| replace with $anyseq drivers (for formal) |
| |
| -anyconst |
| replace with $anyconst drivers (for formal) |
| |
| -random <seed> |
| replace with random bits using the specified integer als seed |
| value for the random number generator. |
| |
| -init |
| also create/update init values for flip-flops |
| \end{lstlisting} |
| |
| \section{share -- perform sat-based resource sharing} |
| \label{cmd:share} |
| \begin{lstlisting}[numbers=left,frame=single] |
| share [options] [selection] |
| |
| This pass merges shareable resources into a single resource. A SAT solver |
| is used to determine if two resources are share-able. |
| |
| -force |
| Per default the selection of cells that is considered for sharing is |
| narrowed using a list of cell types. With this option all selected |
| cells are considered for resource sharing. |
| |
| IMPORTANT NOTE: If the -all option is used then no cells with internal |
| state must be selected! |
| |
| -aggressive |
| Per default some heuristics are used to reduce the number of cells |
| considered for resource sharing to only large resources. This options |
| turns this heuristics off, resulting in much more cells being considered |
| for resource sharing. |
| |
| -fast |
| Only consider the simple part of the control logic in SAT solving, resulting |
| in much easier SAT problems at the cost of maybe missing some opportunities |
| for resource sharing. |
| |
| -limit N |
| Only perform the first N merges, then stop. This is useful for debugging. |
| \end{lstlisting} |
| |
| \section{shell -- enter interactive command mode} |
| \label{cmd:shell} |
| \begin{lstlisting}[numbers=left,frame=single] |
| shell |
| |
| This command enters the interactive command mode. This can be useful |
| in a script to interrupt the script at a certain point and allow for |
| interactive inspection or manual synthesis of the design at this point. |
| |
| The command prompt of the interactive shell indicates the current |
| selection (see 'help select'): |
| |
| yosys> |
| the entire design is selected |
| |
| yosys*> |
| only part of the design is selected |
| |
| yosys [modname]> |
| the entire module 'modname' is selected using 'select -module modname' |
| |
| yosys [modname]*> |
| only part of current module 'modname' is selected |
| |
| When in interactive shell, some errors (e.g. invalid command arguments) |
| do not terminate yosys but return to the command prompt. |
| |
| This command is the default action if nothing else has been specified |
| on the command line. |
| |
| Press Ctrl-D or type 'exit' to leave the interactive shell. |
| \end{lstlisting} |
| |
| \section{show -- generate schematics using graphviz} |
| \label{cmd:show} |
| \begin{lstlisting}[numbers=left,frame=single] |
| show [options] [selection] |
| |
| Create a graphviz DOT file for the selected part of the design and compile it |
| to a graphics file (usually SVG or PostScript). |
| |
| -viewer <viewer> |
| Run the specified command with the graphics file as parameter. |
| On Windows, this pauses yosys until the viewer exits. |
| |
| -format <format> |
| Generate a graphics file in the specified format. Use 'dot' to just |
| generate a .dot file, or other <format> strings such as 'svg' or 'ps' |
| to generate files in other formats (this calls the 'dot' command). |
| |
| -lib <verilog_or_ilang_file> |
| Use the specified library file for determining whether cell ports are |
| inputs or outputs. This option can be used multiple times to specify |
| more than one library. |
| |
| note: in most cases it is better to load the library before calling |
| show with 'read_verilog -lib <filename>'. it is also possible to |
| load liberty files with 'read_liberty -lib <filename>'. |
| |
| -prefix <prefix> |
| generate <prefix>.* instead of ~/.yosys_show.* |
| |
| -color <color> <object> |
| assign the specified color to the specified object. The object can be |
| a single selection wildcard expressions or a saved set of objects in |
| the @<name> syntax (see "help select" for details). |
| |
| -label <text> <object> |
| assign the specified label text to the specified object. The object can |
| be a single selection wildcard expressions or a saved set of objects in |
| the @<name> syntax (see "help select" for details). |
| |
| -colors <seed> |
| Randomly assign colors to the wires. The integer argument is the seed |
| for the random number generator. Change the seed value if the colored |
| graph still is ambiguous. A seed of zero deactivates the coloring. |
| |
| -colorattr <attribute_name> |
| Use the specified attribute to assign colors. A unique color is |
| assigned to each unique value of this attribute. |
| |
| -width |
| annotate busses with a label indicating the width of the bus. |
| |
| -signed |
| mark ports (A, B) that are declared as signed (using the [AB]_SIGNED |
| cell parameter) with an asterisk next to the port name. |
| |
| -stretch |
| stretch the graph so all inputs are on the left side and all outputs |
| (including inout ports) are on the right side. |
| |
| -pause |
| wait for the use to press enter to before returning |
| |
| -enum |
| enumerate objects with internal ($-prefixed) names |
| |
| -long |
| do not abbreviate objects with internal ($-prefixed) names |
| |
| -notitle |
| do not add the module name as graph title to the dot file |
| |
| When no <format> is specified, 'dot' is used. When no <format> and <viewer> is |
| specified, 'xdot' is used to display the schematic (POSIX systems only). |
| |
| The generated output files are '~/.yosys_show.dot' and '~/.yosys_show.<format>', |
| unless another prefix is specified using -prefix <prefix>. |
| |
| Yosys on Windows and YosysJS use different defaults: The output is written |
| to 'show.dot' in the current directory and new viewer is launched each time |
| the 'show' command is executed. |
| \end{lstlisting} |
| |
| \section{shregmap -- map shift registers} |
| \label{cmd:shregmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| shregmap [options] [selection] |
| |
| This pass converts chains of $_DFF_[NP]_ gates to target specific shift register |
| primitives. The generated shift register will be of type $__SHREG_DFF_[NP]_ and |
| will use the same interface as the original $_DFF_*_ cells. The cell parameter |
| 'DEPTH' will contain the depth of the shift register. Use a target-specific |
| 'techmap' map file to convert those cells to the actual target cells. |
| |
| -minlen N |
| minimum length of shift register (default = 2) |
| (this is the length after -keep_before and -keep_after) |
| |
| -maxlen N |
| maximum length of shift register (default = no limit) |
| larger chains will be mapped to multiple shift register instances |
| |
| -keep_before N |
| number of DFFs to keep before the shift register (default = 0) |
| |
| -keep_after N |
| number of DFFs to keep after the shift register (default = 0) |
| |
| -clkpol pos|neg|any |
| limit match to only positive or negative edge clocks. (default = any) |
| |
| -enpol pos|neg|none|any_or_none|any |
| limit match to FFs with the specified enable polarity. (default = none) |
| |
| -match <cell_type>[:<d_port_name>:<q_port_name>] |
| match the specified cells instead of $_DFF_N_ and $_DFF_P_. If |
| ':<d_port_name>:<q_port_name>' is omitted then 'D' and 'Q' is used |
| by default. E.g. the option '-clkpol pos' is just an alias for |
| '-match $_DFF_P_', which is an alias for '-match $_DFF_P_:D:Q'. |
| |
| -params |
| instead of encoding the clock and enable polarity in the cell name by |
| deriving from the original cell name, simply name all generated cells |
| $__SHREG_ and use CLKPOL and ENPOL parameters. An ENPOL value of 2 is |
| used to denote cells without enable input. The ENPOL parameter is |
| omitted when '-enpol none' (or no -enpol option) is passed. |
| |
| -zinit |
| assume the shift register is automatically zero-initialized, so it |
| becomes legal to merge zero initialized FFs into the shift register. |
| |
| -init |
| map initialized registers to the shift reg, add an INIT parameter to |
| generated cells with the initialization value. (first bit to shift out |
| in LSB position) |
| |
| -tech greenpak4 |
| map to greenpak4 shift registers. |
| \end{lstlisting} |
| |
| \section{sim -- simulate the circuit} |
| \label{cmd:sim} |
| \begin{lstlisting}[numbers=left,frame=single] |
| sim [options] [top-level] |
| |
| This command simulates the circuit using the given top-level module. |
| |
| -vcd <filename> |
| write the simulation results to the given VCD file |
| |
| -clock <portname> |
| name of top-level clock input |
| |
| -clockn <portname> |
| name of top-level clock input (inverse polarity) |
| |
| -reset <portname> |
| name of top-level reset input (active high) |
| |
| -resetn <portname> |
| name of top-level inverted reset input (active low) |
| |
| -rstlen <integer> |
| number of cycles reset should stay active (default: 1) |
| |
| -zinit |
| zero-initialize all uninitialized regs and memories |
| |
| -n <integer> |
| number of cycles to simulate (default: 20) |
| |
| -a |
| include all nets in VCD output, not just those with public names |
| |
| -w |
| writeback mode: use final simulation state as new init state |
| |
| -d |
| enable debug output |
| \end{lstlisting} |
| |
| \section{simplemap -- mapping simple coarse-grain cells} |
| \label{cmd:simplemap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| simplemap [selection] |
| |
| This pass maps a small selection of simple coarse-grain cells to yosys gate |
| primitives. The following internal cell types are mapped by this pass: |
| |
| $not, $pos, $and, $or, $xor, $xnor |
| $reduce_and, $reduce_or, $reduce_xor, $reduce_xnor, $reduce_bool |
| $logic_not, $logic_and, $logic_or, $mux, $tribuf |
| $sr, $ff, $dff, $dffsr, $adff, $dlatch |
| \end{lstlisting} |
| |
| \section{splice -- create explicit splicing cells} |
| \label{cmd:splice} |
| \begin{lstlisting}[numbers=left,frame=single] |
| splice [options] [selection] |
| |
| This command adds $slice and $concat cells to the design to make the splicing |
| of multi-bit signals explicit. This for example is useful for coarse grain |
| synthesis, where dedicated hardware is needed to splice signals. |
| |
| -sel_by_cell |
| only select the cell ports to rewire by the cell. if the selection |
| contains a cell, than all cell inputs are rewired, if necessary. |
| |
| -sel_by_wire |
| only select the cell ports to rewire by the wire. if the selection |
| contains a wire, than all cell ports driven by this wire are wired, |
| if necessary. |
| |
| -sel_any_bit |
| it is sufficient if the driver of any bit of a cell port is selected. |
| by default all bits must be selected. |
| |
| -wires |
| also add $slice and $concat cells to drive otherwise unused wires. |
| |
| -no_outputs |
| do not rewire selected module outputs. |
| |
| -port <name> |
| only rewire cell ports with the specified name. can be used multiple |
| times. implies -no_output. |
| |
| -no_port <name> |
| do not rewire cell ports with the specified name. can be used multiple |
| times. can not be combined with -port <name>. |
| |
| By default selected output wires and all cell ports of selected cells driven |
| by selected wires are rewired. |
| \end{lstlisting} |
| |
| \section{splitnets -- split up multi-bit nets} |
| \label{cmd:splitnets} |
| \begin{lstlisting}[numbers=left,frame=single] |
| splitnets [options] [selection] |
| |
| This command splits multi-bit nets into single-bit nets. |
| |
| -format char1[char2[char3]] |
| the first char is inserted between the net name and the bit index, the |
| second char is appended to the netname. e.g. -format () creates net |
| names like 'mysignal(42)'. the 3rd character is the range separation |
| character when creating multi-bit wires. the default is '[]:'. |
| |
| -ports |
| also split module ports. per default only internal signals are split. |
| |
| -driver |
| don't blindly split nets in individual bits. instead look at the driver |
| and split nets so that no driver drives only part of a net. |
| \end{lstlisting} |
| |
| \section{stat -- print some statistics} |
| \label{cmd:stat} |
| \begin{lstlisting}[numbers=left,frame=single] |
| stat [options] [selection] |
| |
| Print some statistics (number of objects) on the selected portion of the |
| design. |
| |
| -top <module> |
| print design hierarchy with this module as top. if the design is fully |
| selected and a module has the 'top' attribute set, this module is used |
| default value for this option. |
| |
| -liberty <liberty_file> |
| use cell area information from the provided liberty file |
| |
| -width |
| annotate internal cell types with their word width. |
| e.g. $add_8 for an 8 bit wide $add cell. |
| \end{lstlisting} |
| |
| \section{submod -- moving part of a module to a new submodule} |
| \label{cmd:submod} |
| \begin{lstlisting}[numbers=left,frame=single] |
| submod [-copy] [selection] |
| |
| This pass identifies all cells with the 'submod' attribute and moves them to |
| a newly created module. The value of the attribute is used as name for the |
| cell that replaces the group of cells with the same attribute value. |
| |
| This pass can be used to create a design hierarchy in flat design. This can |
| be useful for analyzing or reverse-engineering a design. |
| |
| This pass only operates on completely selected modules with no processes |
| or memories. |
| |
| |
| submod -name <name> [-copy] [selection] |
| |
| As above, but don't use the 'submod' attribute but instead use the selection. |
| Only objects from one module might be selected. The value of the -name option |
| is used as the value of the 'submod' attribute above. |
| |
| By default the cells are 'moved' from the source module and the source module |
| will use an instance of the new module after this command is finished. Call |
| with -copy to not modify the source module. |
| \end{lstlisting} |
| |
| \section{synth -- generic synthesis script} |
| \label{cmd:synth} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth [options] |
| |
| This command runs the default synthesis script. This command does not operate |
| on partly selected designs. |
| |
| -top <module> |
| use the specified module as top module (default='top') |
| |
| -auto-top |
| automatically determine the top of the design hierarchy |
| |
| -flatten |
| flatten the design before synthesis. this will pass '-auto-top' to |
| 'hierarchy' if no top module is specified. |
| |
| -encfile <file> |
| passed to 'fsm_recode' via 'fsm' |
| |
| -nofsm |
| do not run FSM optimization |
| |
| -noabc |
| do not run abc (as if yosys was compiled without ABC support) |
| |
| -noalumacc |
| do not run 'alumacc' pass. i.e. keep arithmetic operators in |
| their direct form ($add, $sub, etc.). |
| |
| -nordff |
| passed to 'memory'. prohibits merging of FFs into memory read ports |
| |
| -noshare |
| do not run SAT-based resource sharing |
| |
| -run <from_label>[:<to_label>] |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| hierarchy -check [-top <top> | -auto-top] |
| |
| coarse: |
| proc |
| flatten (if -flatten) |
| opt_expr |
| opt_clean |
| check |
| opt |
| wreduce |
| alumacc |
| share |
| opt |
| fsm |
| opt -fast |
| memory -nomap |
| opt_clean |
| |
| fine: |
| opt -fast -full |
| memory_map |
| opt -full |
| techmap |
| opt -fast |
| abc -fast |
| opt -fast |
| |
| check: |
| hierarchy -check |
| stat |
| check |
| \end{lstlisting} |
| |
| \section{synth\_achronix -- synthesis for Acrhonix Speedster22i FPGAs.} |
| \label{cmd:synth_achronix} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_achronix [options] |
| |
| This command runs synthesis for Achronix Speedster eFPGAs. This work is still experimental. |
| |
| -top <module> |
| use the specified module as top module (default='top') |
| |
| -vout <file> |
| write the design to the specified Verilog netlist file. writing of an |
| output file is omitted if this parameter is not specified. |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -noflatten |
| do not flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_verilog -sv -lib +/achronix/speedster22i/cells_sim.v |
| hierarchy -check -top <top> |
| |
| flatten: (unless -noflatten) |
| proc |
| flatten |
| tribuf -logic |
| deminout |
| |
| coarse: |
| synth -run coarse |
| |
| fine: |
| opt -fast -mux_undef -undriven -fine -full |
| memory_map |
| opt -undriven -fine |
| dffsr2dff |
| dff2dffe -direct-match $_DFF_* |
| opt -fine |
| techmap -map +/techmap.v |
| opt -full |
| clean -purge |
| setundef -undriven -zero |
| abc -markgroups -dff (only if -retime) |
| |
| map_luts: |
| abc -lut 4 |
| clean |
| |
| map_cells: |
| iopadmap -bits -outpad $__outpad I:O -inpad $__inpad O:I |
| techmap -map +/achronix/speedster22i/cells_map.v |
| clean -purge |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| vout: |
| write_verilog -nodec -attr2comment -defparam -renameprefix syn_ <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_coolrunner2 -- synthesis for Xilinx Coolrunner-II CPLDs} |
| \label{cmd:synth_coolrunner2} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_coolrunner2 [options] |
| |
| This command runs synthesis for Coolrunner-II CPLDs. This work is experimental. |
| It is intended to be used with https://github.com/azonenberg/openfpga as the |
| place-and-route. |
| |
| -top <module> |
| use the specified module as top module (default='top') |
| |
| -json <file> |
| write the design to the specified JSON file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -noflatten |
| do not flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_verilog -lib +/coolrunner2/cells_sim.v |
| hierarchy -check -top <top> |
| |
| flatten: (unless -noflatten) |
| proc |
| flatten |
| tribuf -logic |
| |
| coarse: |
| synth -run coarse |
| |
| fine: |
| opt -fast -full |
| techmap |
| techmap -map +/coolrunner2/cells_latch.v |
| dfflibmap -prepare -liberty +/coolrunner2/xc2_dff.lib |
| |
| map_tff: |
| abc -g AND,XOR |
| clean |
| extract -map +/coolrunner2/tff_extract.v |
| |
| map_pla: |
| abc -sop -I 40 -P 56 |
| clean |
| |
| map_cells: |
| dfflibmap -liberty +/coolrunner2/xc2_dff.lib |
| dffinit -ff FDCP Q INIT |
| dffinit -ff FDCP_N Q INIT |
| dffinit -ff FTCP Q INIT |
| dffinit -ff FTCP_N Q INIT |
| dffinit -ff LDCP Q INIT |
| dffinit -ff LDCP_N Q INIT |
| coolrunner2_sop |
| iopadmap -bits -inpad IBUF O:I -outpad IOBUFE I:IO -inoutpad IOBUFE O:IO -toutpad IOBUFE E:I:IO -tinoutpad IOBUFE E:O:I:IO |
| attrmvcp -attr src -attr LOC t:IOBUFE n:* |
| attrmvcp -attr src -attr LOC -driven t:IBUF n:* |
| splitnets |
| clean |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| json: |
| write_json <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_easic -- synthesis for eASIC platform} |
| \label{cmd:synth_easic} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_easic [options] |
| |
| This command runs synthesis for eASIC platform. |
| |
| -top <module> |
| use the specified module as top module |
| |
| -vlog <file> |
| write the design to the specified structural Verilog file. writing of |
| an output file is omitted if this parameter is not specified. |
| |
| -etools <path> |
| set path to the eTools installation. (default=/opt/eTools) |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -noflatten |
| do not flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_liberty -lib <etools_phys_clk_lib> |
| read_liberty -lib <etools_logic_lut_lib> |
| hierarchy -check -top <top> |
| |
| flatten: (unless -noflatten) |
| proc |
| flatten |
| |
| coarse: |
| synth -run coarse |
| |
| fine: |
| opt -fast -mux_undef -undriven -fine |
| memory_map |
| opt -undriven -fine |
| techmap |
| opt -fast |
| abc -dff (only if -retime) |
| opt_clean (only if -retime) |
| |
| map: |
| dfflibmap -liberty <etools_phys_clk_lib> |
| abc -liberty <etools_logic_lut_lib> |
| opt_clean |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| vlog: |
| write_verilog -noexpr -attr2comment <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_ecp5 -- synthesis for ECP5 FPGAs} |
| \label{cmd:synth_ecp5} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_ecp5 [options] |
| |
| This command runs synthesis for ECP5 FPGAs. |
| |
| -top <module> |
| use the specified module as top module |
| |
| -blif <file> |
| write the design to the specified BLIF file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -edif <file> |
| write the design to the specified EDIF file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -json <file> |
| write the design to the specified JSON file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -noflatten |
| do not flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| -noccu2 |
| do not use CCU2 cells in output netlist |
| |
| -nodffe |
| do not use flipflops with CE in output netlist |
| |
| -nobram |
| do not use BRAM cells in output netlist |
| |
| -nodram |
| do not use distributed RAM cells in output netlist |
| |
| -nomux |
| do not use PFU muxes to implement LUTs larger than LUT4s |
| |
| -abc2 |
| run two passes of 'abc' for slightly improved logic density |
| |
| -vpr |
| generate an output netlist (and BLIF file) suitable for VPR |
| (this feature is experimental and incomplete) |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_verilog -lib +/ecp5/cells_sim.v |
| hierarchy -check -top <top> |
| |
| flatten: (unless -noflatten) |
| proc |
| flatten |
| tribuf -logic |
| deminout |
| |
| coarse: |
| synth -run coarse |
| |
| bram: (skip if -nobram) |
| |
| dram: (skip if -nodram) |
| memory_bram -rules +/ecp5/dram.txt |
| techmap -map +/ecp5/drams_map.v |
| |
| fine: |
| opt -fast -mux_undef -undriven -fine |
| memory_map |
| opt -undriven -fine |
| techmap -map +/techmap.v -map +/ecp5/arith_map.v |
| abc -dff (only if -retime) |
| |
| map_ffs: |
| dffsr2dff |
| dff2dffs |
| opt_clean |
| dff2dffe -direct-match $_DFF_* -direct-match $__DFFS_* |
| techmap -D NO_LUT -map +/ecp5/cells_map.v |
| opt_expr -mux_undef |
| simplemap |
| |
| map_luts: |
| abc (only if -abc2) |
| abc -lut 4:7 |
| clean |
| |
| map_cells: |
| techmap -map +/ecp5/cells_map.v (with -D NO_LUT in vpr mode) |
| clean |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| blif: |
| opt_clean -purge (vpr mode) |
| write_blif -attr -cname -conn -param <file-name> (vpr mode) |
| write_blif -gates -attr -param <file-name> (non-vpr mode) |
| |
| edif: |
| write_edif <file-name> |
| |
| json: |
| write_json <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_gowin -- synthesis for Gowin FPGAs} |
| \label{cmd:synth_gowin} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_gowin [options] |
| |
| This command runs synthesis for Gowin FPGAs. This work is experimental. |
| |
| -top <module> |
| use the specified module as top module (default='top') |
| |
| -vout <file> |
| write the design to the specified Verilog netlist file. writing of an |
| output file is omitted if this parameter is not specified. |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -retime |
| run 'abc' with -dff option |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_verilog -lib +/gowin/cells_sim.v |
| hierarchy -check -top <top> |
| |
| flatten: |
| proc |
| flatten |
| tribuf -logic |
| deminout |
| |
| coarse: |
| synth -run coarse |
| |
| fine: |
| opt -fast -mux_undef -undriven -fine |
| memory_map |
| opt -undriven -fine |
| techmap |
| clean -purge |
| splitnets -ports |
| setundef -undriven -zero |
| abc -dff (only if -retime) |
| |
| map_luts: |
| abc -lut 4 |
| clean |
| |
| map_cells: |
| techmap -map +/gowin/cells_map.v |
| hilomap -hicell VCC V -locell GND G |
| iopadmap -inpad IBUF O:I -outpad OBUF I:O |
| clean -purge |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| vout: |
| write_verilog -nodec -attr2comment -defparam -renameprefix gen <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_greenpak4 -- synthesis for GreenPAK4 FPGAs} |
| \label{cmd:synth_greenpak4} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_greenpak4 [options] |
| |
| This command runs synthesis for GreenPAK4 FPGAs. This work is experimental. |
| It is intended to be used with https://github.com/azonenberg/openfpga as the |
| place-and-route. |
| |
| -top <module> |
| use the specified module as top module (default='top') |
| |
| -part <part> |
| synthesize for the specified part. Valid values are SLG46140V, |
| SLG46620V, and SLG46621V (default). |
| |
| -json <file> |
| write the design to the specified JSON file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -noflatten |
| do not flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_verilog -lib +/greenpak4/cells_sim.v |
| hierarchy -check -top <top> |
| |
| flatten: (unless -noflatten) |
| proc |
| flatten |
| tribuf -logic |
| |
| coarse: |
| synth -run coarse |
| |
| fine: |
| extract_counter -pout GP_DCMP,GP_DAC -maxwidth 14 |
| clean |
| opt -fast -mux_undef -undriven -fine |
| memory_map |
| opt -undriven -fine |
| techmap |
| techmap -map +/greenpak4/cells_latch.v |
| dfflibmap -prepare -liberty +/greenpak4/gp_dff.lib |
| opt -fast |
| abc -dff (only if -retime) |
| |
| map_luts: |
| nlutmap -assert -luts 0,6,8,2 (for -part SLG46140V) |
| nlutmap -assert -luts 2,8,16,2 (for -part SLG46620V) |
| nlutmap -assert -luts 2,8,16,2 (for -part SLG46621V) |
| clean |
| |
| map_cells: |
| shregmap -tech greenpak4 |
| dfflibmap -liberty +/greenpak4/gp_dff.lib |
| dffinit -ff GP_DFF Q INIT |
| dffinit -ff GP_DFFR Q INIT |
| dffinit -ff GP_DFFS Q INIT |
| dffinit -ff GP_DFFSR Q INIT |
| iopadmap -bits -inpad GP_IBUF OUT:IN -outpad GP_OBUF IN:OUT -inoutpad GP_OBUF OUT:IN -toutpad GP_OBUFT OE:IN:OUT -tinoutpad GP_IOBUF OE:OUT:IN:IO |
| attrmvcp -attr src -attr LOC t:GP_OBUF t:GP_OBUFT t:GP_IOBUF n:* |
| attrmvcp -attr src -attr LOC -driven t:GP_IBUF n:* |
| techmap -map +/greenpak4/cells_map.v |
| greenpak4_dffinv |
| clean |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| json: |
| write_json <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_ice40 -- synthesis for iCE40 FPGAs} |
| \label{cmd:synth_ice40} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_ice40 [options] |
| |
| This command runs synthesis for iCE40 FPGAs. |
| |
| -top <module> |
| use the specified module as top module |
| |
| -blif <file> |
| write the design to the specified BLIF file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -edif <file> |
| write the design to the specified EDIF file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -json <file> |
| write the design to the specified JSON file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -noflatten |
| do not flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| -nocarry |
| do not use SB_CARRY cells in output netlist |
| |
| -nodffe |
| do not use SB_DFFE* cells in output netlist |
| |
| -nobram |
| do not use SB_RAM40_4K* cells in output netlist |
| |
| -abc2 |
| run two passes of 'abc' for slightly improved logic density |
| |
| -vpr |
| generate an output netlist (and BLIF file) suitable for VPR |
| (this feature is experimental and incomplete) |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_verilog -lib +/ice40/cells_sim.v |
| hierarchy -check -top <top> |
| |
| flatten: (unless -noflatten) |
| proc |
| flatten |
| tribuf -logic |
| deminout |
| |
| coarse: |
| synth -run coarse |
| |
| bram: (skip if -nobram) |
| memory_bram -rules +/ice40/brams.txt |
| techmap -map +/ice40/brams_map.v |
| |
| fine: |
| opt -fast -mux_undef -undriven -fine |
| memory_map |
| opt -undriven -fine |
| techmap -map +/techmap.v -map +/ice40/arith_map.v |
| abc -dff (only if -retime) |
| ice40_opt |
| |
| map_ffs: |
| dffsr2dff |
| dff2dffe -direct-match $_DFF_* |
| techmap -D NO_LUT -map +/ice40/cells_map.v |
| opt_expr -mux_undef |
| simplemap |
| ice40_ffinit |
| ice40_ffssr |
| ice40_opt -full |
| |
| map_luts: |
| abc (only if -abc2) |
| ice40_opt (only if -abc2) |
| techmap -map +/ice40/latches_map.v |
| abc -lut 4 |
| clean |
| |
| map_cells: |
| techmap -map +/ice40/cells_map.v (with -D NO_LUT in vpr mode) |
| clean |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| blif: |
| opt_clean -purge (vpr mode) |
| write_blif -attr -cname -conn -param <file-name> (vpr mode) |
| write_blif -gates -attr -param <file-name> (non-vpr mode) |
| |
| edif: |
| write_edif <file-name> |
| |
| json: |
| write_json <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_intel -- synthesis for Intel (Altera) FPGAs.} |
| \label{cmd:synth_intel} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_intel [options] |
| |
| This command runs synthesis for Intel FPGAs. |
| |
| -family < max10 | a10gx | cyclone10 | cyclonev | cycloneiv | cycloneive> |
| generate the synthesis netlist for the specified family. |
| MAX10 is the default target if not family argument specified. |
| For Cyclone GX devices, use cycloneiv argument; For Cyclone E, use cycloneive. |
| Cyclone V and Arria 10 GX devices are experimental, use it with a10gx argument. |
| |
| -top <module> |
| use the specified module as top module (default='top') |
| |
| -vqm <file> |
| write the design to the specified Verilog Quartus Mapping File. Writing of an |
| output file is omitted if this parameter is not specified. |
| |
| -vpr <file> |
| write BLIF files for VPR flow experiments. The synthesized BLIF output file is not |
| compatible with the Quartus flow. Writing of an |
| output file is omitted if this parameter is not specified. |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -noiopads |
| do not use altsyncram cells in output netlist |
| |
| -nobram |
| do not use altsyncram cells in output netlist |
| |
| -noflatten |
| do not flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| |
| family: |
| read_verilog -sv -lib +/intel/max10/cells_sim.v |
| read_verilog -sv -lib +/intel/common/m9k_bb.v |
| read_verilog -sv -lib +/intel/common/altpll_bb.v |
| hierarchy -check -top <top> |
| |
| flatten: (unless -noflatten) |
| proc |
| flatten |
| tribuf -logic |
| deminout |
| |
| coarse: |
| synth -run coarse |
| |
| bram: (skip if -nobram) |
| memory_bram -rules +/intel/common/brams.txt |
| techmap -map +/intel/common/brams_map.v |
| |
| fine: |
| opt -fast -mux_undef -undriven -fine -full |
| memory_map |
| opt -undriven -fine |
| dffsr2dff |
| dff2dffe -direct-match $_DFF_* |
| opt -fine |
| techmap -map +/techmap.v |
| opt -full |
| clean -purge |
| setundef -undriven -zero |
| abc -markgroups -dff (only if -retime) |
| |
| map_luts: |
| abc -lut 4 |
| clean |
| |
| map_cells: |
| iopadmap -bits -outpad $__outpad I:O -inpad $__inpad O:I (unless -noiopads) |
| techmap -map +/intel/max10/cells_map.v |
| dffinit -highlow -ff dffeas q power_up |
| clean -purge |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| vqm: |
| write_verilog -attr2comment -defparam -nohex -decimal -renameprefix syn_ <file-name> |
| |
| vpr: |
| opt_clean -purge |
| write_blif <file-name> |
| \end{lstlisting} |
| |
| \section{synth\_xilinx -- synthesis for Xilinx FPGAs} |
| \label{cmd:synth_xilinx} |
| \begin{lstlisting}[numbers=left,frame=single] |
| synth_xilinx [options] |
| |
| This command runs synthesis for Xilinx FPGAs. This command does not operate on |
| partly selected designs. At the moment this command creates netlists that are |
| compatible with 7-Series Xilinx devices. |
| |
| -top <module> |
| use the specified module as top module |
| |
| -edif <file> |
| write the design to the specified edif file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -blif <file> |
| write the design to the specified BLIF file. writing of an output file |
| is omitted if this parameter is not specified. |
| |
| -vpr |
| generate an output netlist (and BLIF file) suitable for VPR |
| (this feature is experimental and incomplete) |
| |
| -run <from_label>:<to_label> |
| only run the commands between the labels (see below). an empty |
| from label is synonymous to 'begin', and empty to label is |
| synonymous to the end of the command list. |
| |
| -flatten |
| flatten design before synthesis |
| |
| -retime |
| run 'abc' with -dff option |
| |
| |
| The following commands are executed by this synthesis command: |
| |
| begin: |
| read_verilog -lib +/xilinx/cells_sim.v |
| read_verilog -lib +/xilinx/cells_xtra.v |
| read_verilog -lib +/xilinx/brams_bb.v |
| hierarchy -check -top <top> |
| |
| flatten: (only if -flatten) |
| proc |
| flatten |
| |
| coarse: |
| synth -run coarse |
| |
| bram: |
| memory_bram -rules +/xilinx/brams.txt |
| techmap -map +/xilinx/brams_map.v |
| |
| dram: |
| memory_bram -rules +/xilinx/drams.txt |
| techmap -map +/xilinx/drams_map.v |
| |
| fine: |
| opt -fast -full |
| memory_map |
| dffsr2dff |
| dff2dffe |
| opt -full |
| techmap -map +/techmap.v -map +/xilinx/arith_map.v |
| opt -fast |
| |
| map_luts: |
| abc -luts 2:2,3,6:5,10,20 [-dff] |
| clean |
| |
| map_cells: |
| techmap -map +/xilinx/cells_map.v (with -D NO_LUT in vpr mode) |
| dffinit -ff FDRE Q INIT -ff FDCE Q INIT -ff FDPE Q INIT |
| clean |
| |
| check: |
| hierarchy -check |
| stat |
| check -noinit |
| |
| edif: (only if -edif) |
| write_edif <file-name> |
| |
| blif: (only if -blif) |
| write_blif <file-name> |
| \end{lstlisting} |
| |
| \section{tcl -- execute a TCL script file} |
| \label{cmd:tcl} |
| \begin{lstlisting}[numbers=left,frame=single] |
| tcl <filename> |
| |
| This command executes the tcl commands in the specified file. |
| Use 'yosys cmd' to run the yosys command 'cmd' from tcl. |
| |
| The tcl command 'yosys -import' can be used to import all yosys |
| commands directly as tcl commands to the tcl shell. Yosys commands |
| 'proc' and 'rename' are wrapped to tcl commands 'procs' and 'renames' |
| in order to avoid a name collision with the built in commands. |
| \end{lstlisting} |
| |
| \section{techmap -- generic technology mapper} |
| \label{cmd:techmap} |
| \begin{lstlisting}[numbers=left,frame=single] |
| techmap [-map filename] [selection] |
| |
| This pass implements a very simple technology mapper that replaces cells in |
| the design with implementations given in form of a Verilog or ilang source |
| file. |
| |
| -map filename |
| the library of cell implementations to be used. |
| without this parameter a builtin library is used that |
| transforms the internal RTL cells to the internal gate |
| library. |
| |
| -map %<design-name> |
| like -map above, but with an in-memory design instead of a file. |
| |
| -extern |
| load the cell implementations as separate modules into the design |
| instead of inlining them. |
| |
| -max_iter <number> |
| only run the specified number of iterations. |
| |
| -recursive |
| instead of the iterative breadth-first algorithm use a recursive |
| depth-first algorithm. both methods should yield equivalent results, |
| but may differ in performance. |
| |
| -autoproc |
| Automatically call "proc" on implementations that contain processes. |
| |
| -assert |
| this option will cause techmap to exit with an error if it can't map |
| a selected cell. only cell types that end on an underscore are accepted |
| as final cell types by this mode. |
| |
| -D <define>, -I <incdir> |
| this options are passed as-is to the Verilog frontend for loading the |
| map file. Note that the Verilog frontend is also called with the |
| '-nooverwrite' option set. |
| |
| When a module in the map file has the 'techmap_celltype' attribute set, it will |
| match cells with a type that match the text value of this attribute. Otherwise |
| the module name will be used to match the cell. |
| |
| When a module in the map file has the 'techmap_simplemap' attribute set, techmap |
| will use 'simplemap' (see 'help simplemap') to map cells matching the module. |
| |
| When a module in the map file has the 'techmap_maccmap' attribute set, techmap |
| will use 'maccmap' (see 'help maccmap') to map cells matching the module. |
| |
| When a module in the map file has the 'techmap_wrap' attribute set, techmap |
| will create a wrapper for the cell and then run the command string that the |
| attribute is set to on the wrapper module. |
| |
| All wires in the modules from the map file matching the pattern _TECHMAP_* |
| or *._TECHMAP_* are special wires that are used to pass instructions from |
| the mapping module to the techmap command. At the moment the following special |
| wires are supported: |
| |
| _TECHMAP_FAIL_ |
| When this wire is set to a non-zero constant value, techmap will not |
| use this module and instead try the next module with a matching |
| 'techmap_celltype' attribute. |
| |
| When such a wire exists but does not have a constant value after all |
| _TECHMAP_DO_* commands have been executed, an error is generated. |
| |
| _TECHMAP_DO_* |
| This wires are evaluated in alphabetical order. The constant text value |
| of this wire is a yosys command (or sequence of commands) that is run |
| by techmap on the module. A common use case is to run 'proc' on modules |
| that are written using always-statements. |
| |
| When such a wire has a non-constant value at the time it is to be |
| evaluated, an error is produced. That means it is possible for such a |
| wire to start out as non-constant and evaluate to a constant value |
| during processing of other _TECHMAP_DO_* commands. |
| |
| A _TECHMAP_DO_* command may start with the special token 'CONSTMAP; '. |
| in this case techmap will create a copy for each distinct configuration |
| of constant inputs and shorted inputs at this point and import the |
| constant and connected bits into the map module. All further commands |
| are executed in this copy. This is a very convenient way of creating |
| optimized specializations of techmap modules without using the special |
| parameters described below. |
| |
| A _TECHMAP_DO_* command may start with the special token 'RECURSION; '. |
| then techmap will recursively replace the cells in the module with their |
| implementation. This is not affected by the -max_iter option. |
| |
| It is possible to combine both prefixes to 'RECURSION; CONSTMAP; '. |
| |
| In addition to this special wires, techmap also supports special parameters in |
| modules in the map file: |
| |
| _TECHMAP_CELLTYPE_ |
| When a parameter with this name exists, it will be set to the type name |
| of the cell that matches the module. |
| |
| _TECHMAP_CONSTMSK_<port-name>_ |
| _TECHMAP_CONSTVAL_<port-name>_ |
| When this pair of parameters is available in a module for a port, then |
| former has a 1-bit for each constant input bit and the latter has the |
| value for this bit. The unused bits of the latter are set to undef (x). |
| |
| _TECHMAP_BITS_CONNMAP_ |
| _TECHMAP_CONNMAP_<port-name>_ |
| For an N-bit port, the _TECHMAP_CONNMAP_<port-name>_ parameter, if it |
| exists, will be set to an N*_TECHMAP_BITS_CONNMAP_ bit vector containing |
| N words (of _TECHMAP_BITS_CONNMAP_ bits each) that assign each single |
| bit driver a unique id. The values 0-3 are reserved for 0, 1, x, and z. |
| This can be used to detect shorted inputs. |
| |
| When a module in the map file has a parameter where the according cell in the |
| design has a port, the module from the map file is only used if the port in |
| the design is connected to a constant value. The parameter is then set to the |
| constant value. |
| |
| A cell with the name _TECHMAP_REPLACE_ in the map file will inherit the name |
| and attributes of the cell that is being replaced. |
| |
| See 'help extract' for a pass that does the opposite thing. |
| |
| See 'help flatten' for a pass that does flatten the design (which is |
| essentially techmap but using the design itself as map library). |
| \end{lstlisting} |
| |
| \section{tee -- redirect command output to file} |
| \label{cmd:tee} |
| \begin{lstlisting}[numbers=left,frame=single] |
| tee [-q] [-o logfile|-a logfile] cmd |
| |
| Execute the specified command, optionally writing the commands output to the |
| specified logfile(s). |
| |
| -q |
| Do not print output to the normal destination (console and/or log file) |
| |
| -o logfile |
| Write output to this file, truncate if exists. |
| |
| -a logfile |
| Write output to this file, append if exists. |
| |
| +INT, -INT |
| Add/subract INT from the -v setting for this command. |
| \end{lstlisting} |
| |
| \section{test\_abcloop -- automatically test handling of loops in abc command} |
| \label{cmd:test_abcloop} |
| \begin{lstlisting}[numbers=left,frame=single] |
| test_abcloop [options] |
| |
| Test handling of logic loops in ABC. |
| |
| -n {integer} |
| create this number of circuits and test them (default = 100). |
| |
| -s {positive_integer} |
| use this value as rng seed value (default = unix time). |
| \end{lstlisting} |
| |
| \section{test\_autotb -- generate simple test benches} |
| \label{cmd:test_autotb} |
| \begin{lstlisting}[numbers=left,frame=single] |
| test_autotb [options] [filename] |
| |
| Automatically create primitive Verilog test benches for all modules in the |
| design. The generated testbenches toggle the input pins of the module in |
| a semi-random manner and dumps the resulting output signals. |
| |
| This can be used to check the synthesis results for simple circuits by |
| comparing the testbench output for the input files and the synthesis results. |
| |
| The backend automatically detects clock signals. Additionally a signal can |
| be forced to be interpreted as clock signal by setting the attribute |
| 'gentb_clock' on the signal. |
| |
| The attribute 'gentb_constant' can be used to force a signal to a constant |
| value after initialization. This can e.g. be used to force a reset signal |
| low in order to explore more inner states in a state machine. |
| |
| -n <int> |
| number of iterations the test bench should run (default = 1000) |
| \end{lstlisting} |
| |
| \section{test\_cell -- automatically test the implementation of a cell type} |
| \label{cmd:test_cell} |
| \begin{lstlisting}[numbers=left,frame=single] |
| test_cell [options] {cell-types} |
| |
| Tests the internal implementation of the given cell type (for example '$add') |
| by comparing SAT solver, EVAL and TECHMAP implementations of the cell types.. |
| |
| Run with 'all' instead of a cell type to run the test on all supported |
| cell types. Use for example 'all /$add' for all cell types except $add. |
| |
| -n {integer} |
| create this number of cell instances and test them (default = 100). |
| |
| -s {positive_integer} |
| use this value as rng seed value (default = unix time). |
| |
| -f {ilang_file} |
| don't generate circuits. instead load the specified ilang file. |
| |
| -w {filename_prefix} |
| don't test anything. just generate the circuits and write them |
| to ilang files with the specified prefix |
| |
| -map {filename} |
| pass this option to techmap. |
| |
| -simlib |
| use "techmap -D SIMLIB_NOCHECKS -map +/simlib.v -max_iter 2 -autoproc" |
| |
| -aigmap |
| instead of calling "techmap", call "aigmap" |
| |
| -muxdiv |
| when creating test benches with dividers, create an additional mux |
| to mask out the division-by-zero case |
| |
| -script {script_file} |
| instead of calling "techmap", call "script {script_file}". |
| |
| -const |
| set some input bits to random constant values |
| |
| -nosat |
| do not check SAT model or run SAT equivalence checking |
| |
| -noeval |
| do not check const-eval models |
| |
| -edges |
| test cell edges db creator against sat-based implementation |
| |
| -v |
| print additional debug information to the console |
| |
| -vlog {filename} |
| create a Verilog test bench to test simlib and write_verilog |
| \end{lstlisting} |
| |
| \section{torder -- print cells in topological order} |
| \label{cmd:torder} |
| \begin{lstlisting}[numbers=left,frame=single] |
| torder [options] [selection] |
| |
| This command prints the selected cells in topological order. |
| |
| -stop <cell_type> <cell_port> |
| do not use the specified cell port in topological sorting |
| |
| -noautostop |
| by default Q outputs of internal FF cells and memory read port outputs |
| are not used in topological sorting. this option deactivates that. |
| \end{lstlisting} |
| |
| \section{trace -- redirect command output to file} |
| \label{cmd:trace} |
| \begin{lstlisting}[numbers=left,frame=single] |
| trace cmd |
| |
| Execute the specified command, logging all changes the command performs on |
| the design in real time. |
| \end{lstlisting} |
| |
| \section{tribuf -- infer tri-state buffers} |
| \label{cmd:tribuf} |
| \begin{lstlisting}[numbers=left,frame=single] |
| tribuf [options] [selection] |
| |
| This pass transforms $mux cells with 'z' inputs to tristate buffers. |
| |
| -merge |
| merge multiple tri-state buffers driving the same net |
| into a single buffer. |
| |
| -logic |
| convert tri-state buffers that do not drive output ports |
| to non-tristate logic. this option implies -merge. |
| \end{lstlisting} |
| |
| \section{uniquify -- create unique copies of modules} |
| \label{cmd:uniquify} |
| \begin{lstlisting}[numbers=left,frame=single] |
| uniquify [selection] |
| |
| By default, a module that is instantiated by several other modules is only |
| kept once in the design. This preserves the original modularity of the design |
| and reduces the overall size of the design in memory. But it prevents certain |
| optimizations and other operations on the design. This pass creates unique |
| modules for all selected cells. The created modules are marked with the |
| 'unique' attribute. |
| |
| This commands only operates on modules that by themself have the 'unique' |
| attribute set (the 'top' module is unique implicitly). |
| \end{lstlisting} |
| |
| \section{verific -- load Verilog and VHDL designs using Verific} |
| \label{cmd:verific} |
| \begin{lstlisting}[numbers=left,frame=single] |
| verific {-vlog95|-vlog2k|-sv2005|-sv2009|-sv2012|-sv} <verilog-file>.. |
| |
| Load the specified Verilog/SystemVerilog files into Verific. |
| |
| All files specified in one call to this command are one compilation unit. |
| Files passed to different calls to this command are treated as belonging to |
| different compilation units. |
| |
| Additional -D<macro>[=<value>] options may be added after the option indicating |
| the language version (and before file names) to set additional verilog defines. |
| The macros SYNTHESIS and VERIFIC are defined implicitly. |
| |
| |
| verific -formal <verilog-file>.. |
| |
| Like -sv, but define FORMAL instead of SYNTHESIS. |
| |
| |
| verific {-vhdl87|-vhdl93|-vhdl2k|-vhdl2008|-vhdl} <vhdl-file>.. |
| |
| Load the specified VHDL files into Verific. |
| |
| |
| verific -work <libname> {-sv|-vhdl|...} <hdl-file> |
| |
| Load the specified Verilog/SystemVerilog/VHDL file into the specified library. |
| (default library when -work is not present: "work") |
| |
| |
| verific -vlog-incdir <directory>.. |
| |
| Add Verilog include directories. |
| |
| |
| verific -vlog-libdir <directory>.. |
| |
| Add Verilog library directories. Verific will search in this directories to |
| find undefined modules. |
| |
| |
| verific -vlog-define <macro>[=<value>].. |
| |
| Add Verilog defines. |
| |
| |
| verific -vlog-undef <macro>.. |
| |
| Remove Verilog defines previously set with -vlog-define. |
| |
| |
| verific -set-error <msg_id>.. |
| verific -set-warning <msg_id>.. |
| verific -set-info <msg_id>.. |
| verific -set-ignore <msg_id>.. |
| |
| Set message severity. <msg_id> is the string in square brackets when a message |
| is printed, such as VERI-1209. |
| |
| |
| verific -import [options] <top-module>.. |
| |
| Elaborate the design for the specified top modules, import to Yosys and |
| reset the internal state of Verific. |
| |
| Import options: |
| |
| -all |
| Elaborate all modules, not just the hierarchy below the given top |
| modules. With this option the list of modules to import is optional. |
| |
| -gates |
| Create a gate-level netlist. |
| |
| -flatten |
| Flatten the design in Verific before importing. |
| |
| -extnets |
| Resolve references to external nets by adding module ports as needed. |
| |
| -autocover |
| Generate automatic cover statements for all asserts |
| |
| -v, -vv |
| Verbose log messages. (-vv is even more verbose than -v.) |
| |
| The following additional import options are useful for debugging the Verific |
| bindings (for Yosys and/or Verific developers): |
| |
| -k |
| Keep going after an unsupported verific primitive is found. The |
| unsupported primitive is added as blockbox module to the design. |
| This will also add all SVA related cells to the design parallel to |
| the checker logic inferred by it. |
| |
| -V |
| Import Verific netlist as-is without translating to Yosys cell types. |
| |
| -nosva |
| Ignore SVA properties, do not infer checker logic. |
| |
| -L <int> |
| Maximum number of ctrl bits for SVA checker FSMs (default=16). |
| |
| -n |
| Keep all Verific names on instances and nets. By default only |
| user-declared names are preserved. |
| |
| -d <dump_file> |
| Dump the Verific netlist as a verilog file. |
| |
| Visit http://verific.com/ for more information on Verific. |
| \end{lstlisting} |
| |
| \section{verilog\_defaults -- set default options for read\_verilog} |
| \label{cmd:verilog_defaults} |
| \begin{lstlisting}[numbers=left,frame=single] |
| verilog_defaults -add [options] |
| |
| Add the specified options to the list of default options to read_verilog. |
| |
| |
| verilog_defaults -clear |
| |
| Clear the list of Verilog default options. |
| |
| |
| verilog_defaults -push |
| verilog_defaults -pop |
| |
| Push or pop the list of default options to a stack. Note that -push does |
| not imply -clear. |
| \end{lstlisting} |
| |
| \section{verilog\_defines -- define and undefine verilog defines} |
| \label{cmd:verilog_defines} |
| \begin{lstlisting}[numbers=left,frame=single] |
| verilog_defines [options] |
| |
| Define and undefine verilog preprocessor macros. |
| |
| -Dname[=definition] |
| define the preprocessor symbol 'name' and set its optional value |
| 'definition' |
| |
| -Uname[=definition] |
| undefine the preprocessor symbol 'name' |
| \end{lstlisting} |
| |
| \section{wreduce -- reduce the word size of operations if possible} |
| \label{cmd:wreduce} |
| \begin{lstlisting}[numbers=left,frame=single] |
| wreduce [options] [selection] |
| |
| This command reduces the word size of operations. For example it will replace |
| the 32 bit adders in the following code with adders of more appropriate widths: |
| |
| module test(input [3:0] a, b, c, output [7:0] y); |
| assign y = a + b + c + 1; |
| endmodule |
| |
| Options: |
| |
| -memx |
| Do not change the width of memory address ports. Use this options in |
| flows that use the 'memory_memx' pass. |
| \end{lstlisting} |
| |
| \section{write\_aiger -- write design to AIGER file} |
| \label{cmd:write_aiger} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_aiger [options] [filename] |
| |
| Write the current design to an AIGER file. The design must be flattened and |
| must not contain any cell types except $_AND_, $_NOT_, simple FF types, |
| $assert and $assume cells, and $initstate cells. |
| |
| $assert and $assume cells are converted to AIGER bad state properties and |
| invariant constraints. |
| |
| -ascii |
| write ASCII version of AGIER format |
| |
| -zinit |
| convert FFs to zero-initialized FFs, adding additional inputs for |
| uninitialized FFs. |
| |
| -miter |
| design outputs are AIGER bad state properties |
| |
| -symbols |
| include a symbol table in the generated AIGER file |
| |
| -map <filename> |
| write an extra file with port and latch symbols |
| |
| -vmap <filename> |
| like -map, but more verbose |
| \end{lstlisting} |
| |
| \section{write\_blif -- write design to BLIF file} |
| \label{cmd:write_blif} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_blif [options] [filename] |
| |
| Write the current design to an BLIF file. |
| |
| -top top_module |
| set the specified module as design top module |
| |
| -buf <cell-type> <in-port> <out-port> |
| use cells of type <cell-type> with the specified port names for buffers |
| |
| -unbuf <cell-type> <in-port> <out-port> |
| replace buffer cells with the specified name and port names with |
| a .names statement that models a buffer |
| |
| -true <cell-type> <out-port> |
| -false <cell-type> <out-port> |
| -undef <cell-type> <out-port> |
| use the specified cell types to drive nets that are constant 1, 0, or |
| undefined. when '-' is used as <cell-type>, then <out-port> specifies |
| the wire name to be used for the constant signal and no cell driving |
| that wire is generated. when '+' is used as <cell-type>, then <out-port> |
| specifies the wire name to be used for the constant signal and a .names |
| statement is generated to drive the wire. |
| |
| -noalias |
| if a net name is aliasing another net name, then by default a net |
| without fanout is created that is driven by the other net. This option |
| suppresses the generation of this nets without fanout. |
| |
| The following options can be useful when the generated file is not going to be |
| read by a BLIF parser but a custom tool. It is recommended to not name the output |
| file *.blif when any of this options is used. |
| |
| -icells |
| do not translate Yosys's internal gates to generic BLIF logic |
| functions. Instead create .subckt or .gate lines for all cells. |
| |
| -gates |
| print .gate instead of .subckt lines for all cells that are not |
| instantiations of other modules from this design. |
| |
| -conn |
| do not generate buffers for connected wires. instead use the |
| non-standard .conn statement. |
| |
| -attr |
| use the non-standard .attr statement to write cell attributes |
| |
| -param |
| use the non-standard .param statement to write cell parameters |
| |
| -cname |
| use the non-standard .cname statement to write cell names |
| |
| -iname, -iattr |
| enable -cname and -attr functionality for .names statements |
| (the .cname and .attr statements will be included in the BLIF |
| output after the truth table for the .names statement) |
| |
| -blackbox |
| write blackbox cells with .blackbox statement. |
| |
| -impltf |
| do not write definitions for the $true, $false and $undef wires. |
| \end{lstlisting} |
| |
| \section{write\_btor -- write design to BTOR file} |
| \label{cmd:write_btor} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_btor [options] [filename] |
| |
| Write a BTOR description of the current design. |
| |
| -v |
| Add comments and indentation to BTOR output file |
| |
| -s |
| Output only a single bad property for all asserts |
| \end{lstlisting} |
| |
| \section{write\_edif -- write design to EDIF netlist file} |
| \label{cmd:write_edif} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_edif [options] [filename] |
| |
| Write the current design to an EDIF netlist file. |
| |
| -top top_module |
| set the specified module as design top module |
| |
| -nogndvcc |
| do not create "GND" and "VCC" cells. (this will produce an error |
| if the design contains constant nets. use "hilomap" to map to custom |
| constant drivers first) |
| |
| -pvector {par|bra|ang} |
| sets the delimiting character for module port rename clauses to |
| parentheses, square brackets, or angle brackets. |
| |
| Unfortunately there are different "flavors" of the EDIF file format. This |
| command generates EDIF files for the Xilinx place&route tools. It might be |
| necessary to make small modifications to this command when a different tool |
| is targeted. |
| \end{lstlisting} |
| |
| \section{write\_file -- write a text to a file} |
| \label{cmd:write_file} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_file [options] output_file [input_file] |
| |
| Write the text from the input file to the output file. |
| |
| -a |
| Append to output file (instead of overwriting) |
| |
| |
| Inside a script the input file can also can a here-document: |
| |
| write_file hello.txt <<EOT |
| Hello World! |
| EOT |
| \end{lstlisting} |
| |
| \section{write\_firrtl -- write design to a FIRRTL file} |
| \label{cmd:write_firrtl} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_firrtl [options] [filename] |
| |
| Write a FIRRTL netlist of the current design. |
| \end{lstlisting} |
| |
| \section{write\_ilang -- write design to ilang file} |
| \label{cmd:write_ilang} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_ilang [filename] |
| |
| Write the current design to an 'ilang' file. (ilang is a text representation |
| of a design in yosys's internal format.) |
| |
| -selected |
| only write selected parts of the design. |
| \end{lstlisting} |
| |
| \section{write\_intersynth -- write design to InterSynth netlist file} |
| \label{cmd:write_intersynth} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_intersynth [options] [filename] |
| |
| Write the current design to an 'intersynth' netlist file. InterSynth is |
| a tool for Coarse-Grain Example-Driven Interconnect Synthesis. |
| |
| -notypes |
| do not generate celltypes and conntypes commands. i.e. just output |
| the netlists. this is used for postsilicon synthesis. |
| |
| -lib <verilog_or_ilang_file> |
| Use the specified library file for determining whether cell ports are |
| inputs or outputs. This option can be used multiple times to specify |
| more than one library. |
| |
| -selected |
| only write selected modules. modules must be selected entirely or |
| not at all. |
| |
| http://www.clifford.at/intersynth/ |
| \end{lstlisting} |
| |
| \section{write\_json -- write design to a JSON file} |
| \label{cmd:write_json} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_json [options] [filename] |
| |
| Write a JSON netlist of the current design. |
| |
| -aig |
| include AIG models for the different gate types |
| |
| |
| The general syntax of the JSON output created by this command is as follows: |
| |
| { |
| "modules": { |
| <module_name>: { |
| "ports": { |
| <port_name>: <port_details>, |
| ... |
| }, |
| "cells": { |
| <cell_name>: <cell_details>, |
| ... |
| }, |
| "netnames": { |
| <net_name>: <net_details>, |
| ... |
| } |
| } |
| }, |
| "models": { |
| ... |
| }, |
| } |
| |
| Where <port_details> is: |
| |
| { |
| "direction": <"input" | "output" | "inout">, |
| "bits": <bit_vector> |
| } |
| |
| And <cell_details> is: |
| |
| { |
| "hide_name": <1 | 0>, |
| "type": <cell_type>, |
| "parameters": { |
| <parameter_name>: <parameter_value>, |
| ... |
| }, |
| "attributes": { |
| <attribute_name>: <attribute_value>, |
| ... |
| }, |
| "port_directions": { |
| <port_name>: <"input" | "output" | "inout">, |
| ... |
| }, |
| "connections": { |
| <port_name>: <bit_vector>, |
| ... |
| }, |
| } |
| |
| And <net_details> is: |
| |
| { |
| "hide_name": <1 | 0>, |
| "bits": <bit_vector> |
| } |
| |
| The "hide_name" fields are set to 1 when the name of this cell or net is |
| automatically created and is likely not of interest for a regular user. |
| |
| The "port_directions" section is only included for cells for which the |
| interface is known. |
| |
| Module and cell ports and nets can be single bit wide or vectors of multiple |
| bits. Each individual signal bit is assigned a unique integer. The <bit_vector> |
| values referenced above are vectors of this integers. Signal bits that are |
| connected to a constant driver are denoted as string "0" or "1" instead of |
| a number. |
| |
| Numeric parameter and attribute values up to 32 bits are written as decimal |
| values. Numbers larger than that are written as string holding the binary |
| representation of the value. |
| |
| For example the following Verilog code: |
| |
| module test(input x, y); |
| (* keep *) foo #(.P(42), .Q(1337)) |
| foo_inst (.A({x, y}), .B({y, x}), .C({4'd10, {4{x}}})); |
| endmodule |
| |
| Translates to the following JSON output: |
| |
| { |
| "modules": { |
| "test": { |
| "ports": { |
| "x": { |
| "direction": "input", |
| "bits": [ 2 ] |
| }, |
| "y": { |
| "direction": "input", |
| "bits": [ 3 ] |
| } |
| }, |
| "cells": { |
| "foo_inst": { |
| "hide_name": 0, |
| "type": "foo", |
| "parameters": { |
| "Q": 1337, |
| "P": 42 |
| }, |
| "attributes": { |
| "keep": 1, |
| "src": "test.v:2" |
| }, |
| "connections": { |
| "C": [ 2, 2, 2, 2, "0", "1", "0", "1" ], |
| "B": [ 2, 3 ], |
| "A": [ 3, 2 ] |
| } |
| } |
| }, |
| "netnames": { |
| "y": { |
| "hide_name": 0, |
| "bits": [ 3 ], |
| "attributes": { |
| "src": "test.v:1" |
| } |
| }, |
| "x": { |
| "hide_name": 0, |
| "bits": [ 2 ], |
| "attributes": { |
| "src": "test.v:1" |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| The models are given as And-Inverter-Graphs (AIGs) in the following form: |
| |
| "models": { |
| <model_name>: [ |
| /* 0 */ [ <node-spec> ], |
| /* 1 */ [ <node-spec> ], |
| /* 2 */ [ <node-spec> ], |
| ... |
| ], |
| ... |
| }, |
| |
| The following node-types may be used: |
| |
| [ "port", <portname>, <bitindex>, <out-list> ] |
| - the value of the specified input port bit |
| |
| [ "nport", <portname>, <bitindex>, <out-list> ] |
| - the inverted value of the specified input port bit |
| |
| [ "and", <node-index>, <node-index>, <out-list> ] |
| - the ANDed value of the specified nodes |
| |
| [ "nand", <node-index>, <node-index>, <out-list> ] |
| - the inverted ANDed value of the specified nodes |
| |
| [ "true", <out-list> ] |
| - the constant value 1 |
| |
| [ "false", <out-list> ] |
| - the constant value 0 |
| |
| All nodes appear in topological order. I.e. only nodes with smaller indices |
| are referenced by "and" and "nand" nodes. |
| |
| The optional <out-list> at the end of a node specification is a list of |
| output portname and bitindex pairs, specifying the outputs driven by this node. |
| |
| For example, the following is the model for a 3-input 3-output $reduce_and cell |
| inferred by the following code: |
| |
| module test(input [2:0] in, output [2:0] out); |
| assign in = &out; |
| endmodule |
| |
| "$reduce_and:3U:3": [ |
| /* 0 */ [ "port", "A", 0 ], |
| /* 1 */ [ "port", "A", 1 ], |
| /* 2 */ [ "and", 0, 1 ], |
| /* 3 */ [ "port", "A", 2 ], |
| /* 4 */ [ "and", 2, 3, "Y", 0 ], |
| /* 5 */ [ "false", "Y", 1, "Y", 2 ] |
| ] |
| |
| Future version of Yosys might add support for additional fields in the JSON |
| format. A program processing this format must ignore all unknown fields. |
| \end{lstlisting} |
| |
| \section{write\_simplec -- convert design to simple C code} |
| \label{cmd:write_simplec} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_simplec [options] [filename] |
| |
| Write simple C code for simulating the design. The C code writen can be used to |
| simulate the design in a C environment, but the purpose of this command is to |
| generate code that works well with C-based formal verification. |
| |
| -verbose |
| this will print the recursive walk used to export the modules. |
| |
| -i8, -i16, -i32, -i64 |
| set the maximum integer bit width to use in the generated code. |
| |
| THIS COMMAND IS UNDER CONSTRUCTION |
| \end{lstlisting} |
| |
| \section{write\_smt2 -- write design to SMT-LIBv2 file} |
| \label{cmd:write_smt2} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_smt2 [options] [filename] |
| |
| Write a SMT-LIBv2 [1] description of the current design. For a module with name |
| '<mod>' this will declare the sort '<mod>_s' (state of the module) and will |
| define and declare functions operating on that state. |
| |
| The following SMT2 functions are generated for a module with name '<mod>'. |
| Some declarations/definitions are printed with a special comment. A prover |
| using the SMT2 files can use those comments to collect all relevant metadata |
| about the design. |
| |
| ; yosys-smt2-module <mod> |
| (declare-sort |<mod>_s| 0) |
| The sort representing a state of module <mod>. |
| |
| (define-fun |<mod>_h| ((state |<mod>_s|)) Bool (...)) |
| This function must be asserted for each state to establish the |
| design hierarchy. |
| |
| ; yosys-smt2-input <wirename> <width> |
| ; yosys-smt2-output <wirename> <width> |
| ; yosys-smt2-register <wirename> <width> |
| ; yosys-smt2-wire <wirename> <width> |
| (define-fun |<mod>_n <wirename>| (|<mod>_s|) (_ BitVec <width>)) |
| (define-fun |<mod>_n <wirename>| (|<mod>_s|) Bool) |
| For each port, register, and wire with the 'keep' attribute set an |
| accessor function is generated. Single-bit wires are returned as Bool, |
| multi-bit wires as BitVec. |
| |
| ; yosys-smt2-cell <submod> <instancename> |
| (declare-fun |<mod>_h <instancename>| (|<mod>_s|) |<submod>_s|) |
| There is a function like that for each hierarchical instance. It |
| returns the sort that represents the state of the sub-module that |
| implements the instance. |
| |
| (declare-fun |<mod>_is| (|<mod>_s|) Bool) |
| This function must be asserted 'true' for initial states, and 'false' |
| otherwise. |
| |
| (define-fun |<mod>_i| ((state |<mod>_s|)) Bool (...)) |
| This function must be asserted 'true' for initial states. For |
| non-initial states it must be left unconstrained. |
| |
| (define-fun |<mod>_t| ((state |<mod>_s|) (next_state |<mod>_s|)) Bool (...)) |
| This function evaluates to 'true' if the states 'state' and |
| 'next_state' form a valid state transition. |
| |
| (define-fun |<mod>_a| ((state |<mod>_s|)) Bool (...)) |
| This function evaluates to 'true' if all assertions hold in the state. |
| |
| (define-fun |<mod>_u| ((state |<mod>_s|)) Bool (...)) |
| This function evaluates to 'true' if all assumptions hold in the state. |
| |
| ; yosys-smt2-assert <id> <filename:linenum> |
| (define-fun |<mod>_a <id>| ((state |<mod>_s|)) Bool (...)) |
| Each $assert cell is converted into one of this functions. The function |
| evaluates to 'true' if the assert statement holds in the state. |
| |
| ; yosys-smt2-assume <id> <filename:linenum> |
| (define-fun |<mod>_u <id>| ((state |<mod>_s|)) Bool (...)) |
| Each $assume cell is converted into one of this functions. The function |
| evaluates to 'true' if the assume statement holds in the state. |
| |
| ; yosys-smt2-cover <id> <filename:linenum> |
| (define-fun |<mod>_c <id>| ((state |<mod>_s|)) Bool (...)) |
| Each $cover cell is converted into one of this functions. The function |
| evaluates to 'true' if the cover statement is activated in the state. |
| |
| Options: |
| |
| -verbose |
| this will print the recursive walk used to export the modules. |
| |
| -stbv |
| Use a BitVec sort to represent a state instead of an uninterpreted |
| sort. As a side-effect this will prevent use of arrays to model |
| memories. |
| |
| -stdt |
| Use SMT-LIB 2.6 style datatypes to represent a state instead of an |
| uninterpreted sort. |
| |
| -nobv |
| disable support for BitVec (FixedSizeBitVectors theory). without this |
| option multi-bit wires are represented using the BitVec sort and |
| support for coarse grain cells (incl. arithmetic) is enabled. |
| |
| -nomem |
| disable support for memories (via ArraysEx theory). this option is |
| implied by -nobv. only $mem cells without merged registers in |
| read ports are supported. call "memory" with -nordff to make sure |
| that no registers are merged into $mem read ports. '<mod>_m' functions |
| will be generated for accessing the arrays that are used to represent |
| memories. |
| |
| -wires |
| create '<mod>_n' functions for all public wires. by default only ports, |
| registers, and wires with the 'keep' attribute are exported. |
| |
| -tpl <template_file> |
| use the given template file. the line containing only the token '%%' |
| is replaced with the regular output of this command. |
| |
| [1] For more information on SMT-LIBv2 visit http://smt-lib.org/ or read David |
| R. Cok's tutorial: http://www.grammatech.com/resources/smt/SMTLIBTutorial.pdf |
| |
| --------------------------------------------------------------------------- |
| |
| Example: |
| |
| Consider the following module (test.v). We want to prove that the output can |
| never transition from a non-zero value to a zero value. |
| |
| module test(input clk, output reg [3:0] y); |
| always @(posedge clk) |
| y <= (y << 1) | ^y; |
| endmodule |
| |
| For this proof we create the following template (test.tpl). |
| |
| ; we need QF_UFBV for this poof |
| (set-logic QF_UFBV) |
| |
| ; insert the auto-generated code here |
| %% |
| |
| ; declare two state variables s1 and s2 |
| (declare-fun s1 () test_s) |
| (declare-fun s2 () test_s) |
| |
| ; state s2 is the successor of state s1 |
| (assert (test_t s1 s2)) |
| |
| ; we are looking for a model with y non-zero in s1 |
| (assert (distinct (|test_n y| s1) #b0000)) |
| |
| ; we are looking for a model with y zero in s2 |
| (assert (= (|test_n y| s2) #b0000)) |
| |
| ; is there such a model? |
| (check-sat) |
| |
| The following yosys script will create a 'test.smt2' file for our proof: |
| |
| read_verilog test.v |
| hierarchy -check; proc; opt; check -assert |
| write_smt2 -bv -tpl test.tpl test.smt2 |
| |
| Running 'cvc4 test.smt2' will print 'unsat' because y can never transition |
| from non-zero to zero in the test design. |
| \end{lstlisting} |
| |
| \section{write\_smv -- write design to SMV file} |
| \label{cmd:write_smv} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_smv [options] [filename] |
| |
| Write an SMV description of the current design. |
| |
| -verbose |
| this will print the recursive walk used to export the modules. |
| |
| -tpl <template_file> |
| use the given template file. the line containing only the token '%%' |
| is replaced with the regular output of this command. |
| |
| THIS COMMAND IS UNDER CONSTRUCTION |
| \end{lstlisting} |
| |
| \section{write\_spice -- write design to SPICE netlist file} |
| \label{cmd:write_spice} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_spice [options] [filename] |
| |
| Write the current design to an SPICE netlist file. |
| |
| -big_endian |
| generate multi-bit ports in MSB first order |
| (default is LSB first) |
| |
| -neg net_name |
| set the net name for constant 0 (default: Vss) |
| |
| -pos net_name |
| set the net name for constant 1 (default: Vdd) |
| |
| -nc_prefix |
| prefix for not-connected nets (default: _NC) |
| |
| -inames |
| include names of internal ($-prefixed) nets in outputs |
| (default is to use net numbers instead) |
| |
| -top top_module |
| set the specified module as design top module |
| \end{lstlisting} |
| |
| \section{write\_table -- write design as connectivity table} |
| \label{cmd:write_table} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_table [options] [filename] |
| |
| Write the current design as connectivity table. The output is a tab-separated |
| ASCII table with the following columns: |
| |
| module name |
| cell name |
| cell type |
| cell port |
| direction |
| signal |
| |
| module inputs and outputs are output using cell type and port '-' and with |
| 'pi' (primary input) or 'po' (primary output) or 'pio' as direction. |
| \end{lstlisting} |
| |
| \section{write\_verilog -- write design to Verilog file} |
| \label{cmd:write_verilog} |
| \begin{lstlisting}[numbers=left,frame=single] |
| write_verilog [options] [filename] |
| |
| Write the current design to a Verilog file. |
| |
| -norename |
| without this option all internal object names (the ones with a dollar |
| instead of a backslash prefix) are changed to short names in the |
| format '_<number>_'. |
| |
| -renameprefix <prefix> |
| insert this prefix in front of auto-generated instance names |
| |
| -noattr |
| with this option no attributes are included in the output |
| |
| -attr2comment |
| with this option attributes are included as comments in the output |
| |
| -noexpr |
| without this option all internal cells are converted to Verilog |
| expressions. |
| |
| -nodec |
| 32-bit constant values are by default dumped as decimal numbers, |
| not bit pattern. This option deactivates this feature and instead |
| will write out all constants in binary. |
| |
| -decimal |
| dump 32-bit constants in decimal and without size and radix |
| |
| -nohex |
| constant values that are compatible with hex output are usually |
| dumped as hex values. This option deactivates this feature and |
| instead will write out all constants in binary. |
| |
| -nostr |
| Parameters and attributes that are specified as strings in the |
| original input will be output as strings by this back-end. This |
| deactivates this feature and instead will write string constants |
| as binary numbers. |
| |
| -defparam |
| Use 'defparam' statements instead of the Verilog-2001 syntax for |
| cell parameters. |
| |
| -blackboxes |
| usually modules with the 'blackbox' attribute are ignored. with |
| this option set only the modules with the 'blackbox' attribute |
| are written to the output file. |
| |
| -selected |
| only write selected modules. modules must be selected entirely or |
| not at all. |
| |
| -v |
| verbose output (print new names of all renamed wires and cells) |
| |
| Note that RTLIL processes can't always be mapped directly to Verilog |
| always blocks. This frontend should only be used to export an RTLIL |
| netlist, i.e. after the "proc" pass has been used to convert all |
| processes to logic networks and registers. A warning is generated when |
| this command is called on a design with RTLIL processes. |
| \end{lstlisting} |
| |
| \section{zinit -- add inverters so all FF are zero-initialized} |
| \label{cmd:zinit} |
| \begin{lstlisting}[numbers=left,frame=single] |
| zinit [options] [selection] |
| |
| Add inverters as needed to make all FFs zero-initialized. |
| |
| -all |
| also add zero initialization to uninitialized FFs |
| \end{lstlisting} |
| |