NAME¶
sxlib - a portable CMOS Standard Cell Library
ORIGIN¶
This software belongs to the ALLIANCE CAD SYSTEM developed by the ASIM team at
  
LIP6 laboratory of Université Pierre et Marie CURIE, in Paris,
  France.
 
Web : 
http://asim.lip6.fr/recherche/alliance/
 
E-mail : 
alliance-users@asim.lip6.fr
DESCRIPTION¶
sxlib library contains standard cells that have been developed at
  UPMC-ASIM/LIP6. This manual gives the list of available cells, with their
  behavior, width, maximum delay and input fan-in. This manual gives also few
  thumb rules to help the user to well use the cells. The given delay are the
  maximum (that means worst case for a generic .35 micron process). More precise
  delay can be found in ALLIANCE VHDL behavior files (.vbe file). Cell-name is
  built that way <behavior>_<output drive> (see explanations below).
Four files are attached to each cell:-
- ALLIANCE Layout ............... cell-name.ap
- ALLIANCE Transistor net-list .. cell-name.al
- ALLIANCE VHDL behavior ........ cell-name.vbe
- Compiled HILO behavior ........ 0000000xx.dat
And few files more:-
- CATAL ......................... ALLIANCE catalog file
- sxlib.cct ..................... Cell definition for HILO CAD tools
- CIRCUIT.idx ................... HILO catalog file
- sxlib.lib ..................... Cell definition for Synopsys CAD tools
- sxlib.db ...................... Compiled cell definition for Synopsys
- sxlib.sdb ..................... Icon definition for Synopys
PHYSICAL OUTLINE¶
sxlib uses the symbolic layout promoted by Alliance in order to provide
  process independence. All dimensions are in lambda units. The mapping to a
  specific process CIF or GDS2 layout must be performed by the 
s2r tool
  (symbolic to real), which uses a value for the lambda (e.g. 1 lambda=0.3um).
       _________________
   50 |       VDD       |
   45 |_________________|     x : place of virtual connector.
   40 |           x     |
   35 |        x  x     |         they are named : name_<y>
   30 |  x     x        |
   25 |  x     x        |         for example : i0_20
   20 |  x              |                       i0_25
   15 |           x     |                       i0_30
   10 |_________________|
    5 |       VSS       |
    0 |_________________|
      0  5 10 15 20 25 30
All cells are 50 lambdas high and 
N times 5 lambdas wide, where 
N
  is the number of pitches. That is the only physical information given in the
  cell list below. Power supplies are in horizontal ALU1 and are 6 lambdas wide.
  Connectors are inside the cells, placed on a 5x5 grid. Half layout design
  rules are a warranty for any layer on any face, except for the power supply
  and NWELL. Cells can be abutted in all directions whenever the supply is well
  connected and connectors are always placed on the 5x5 grid.
DELAY MODEL¶
Cells have been extracted and simulated by using a generic 0.35um process in
  order to give realistic values for the delays and capacitances. We chose to
  give only the worst delay for each output signal, though it is not very
  realistic (since delay depends on each input, an input can be easily up to
  twice faster than another). However, we just wanted to give an idea of the
  relative delay.
Furthermore, we added 0.6ns to each output delay in order to take into account
  the delay due to the signal commutation. We have supposed the output drives
  the maximum capacitance. This capacitance have been computed as follow. We
  considered that a good slope signal for this process was 0.8ns. Then we
  searched for the capacitance required to obtain the same input and output
  slope (0.8ns) for the smaller inverter (inv_x1). That was 125fF. We simulated
  the same inverter without output capacitance. The delay difference was about
  0.6ns. This result is not exactly the same for all cells, but 0.6ns is a good
  approximation.
The given delay is then a worst case (70degree, 2.7Volt, slow process, worst
  input), an idea of the typical delay can be obtain by dividing worst delay by
  1.5, and best delay by dividing by 2. More detailed data can be found in
  GENERIC data included in the VHDL files (.vbe). Examples can be found at the
  end of this manual.
At last, to get a very better idea about the real delay without simulating the
  spice transistor netlist, it is required to use the TAS (1) tool, which is a
  timing static analyzer able to give the longer and the shorter path for a
  given process.
OUTPUT DRIVE¶
The output drive of a cell gives an information on the faculty for the cell to
  drive a big capacitance. This faculty depends on the rising and falling output
  resistance. The smaller the resistance, the bigger can be the capacitance.
  Minimum drive is 
x1. This corresponds to the smallest available
  inverter (inv_x1). 
x2 means the cell is equivalent (from the driving
  point of view) at two smaller inverters in parallel, and so on.
The maximum output drive is 
x8. It is limited because of the maximum
  output slope and the maximum authorized instantaneous current. If it was
  bigger the output slope could be very tight and the current too big.
With the 0.35um process, an 
x1 is able to drive about 
125fF,
  
x2 -> 
250fF, 
x4 -> 
500fF,
x8 ->
  
1000fF. This is just an indication since if a cell is overloaded, the
  only consequence is to increase the propagation time. On the other hand, it is
  not very good to under-load a cell because this leads to a signal overshoot.
  Actually, for big gate, such as noa3ao322_x1, 
x1 means maximal driving
  strength reachable with a single logic layer, that can be much less than an
  inv_x1. That is why is the cell list below contains more precise drive
  strengh. As you can see noa3ao322_x1 as a output drive strengh of 0.6, that
  means 0.6 time an inverter, so say it can drive about 0.6*125fF=75fF.
With the 0.35um process, a 
1 lambda interconnect wire is about
  
0.15fF, an average cell fan-in is 10fF. Then, if it needs about 50
  lambdas to connect 2 cells, an 
x1 cell is able to drive about 7 cells
  (125/(10+50*.15)=7). With 100 lambdas, 5 cells, with 750 lambdas only 2 cells.
  Note that 50 lambdas means cells are very close one from each other, nearly
  abutted, 100 lambdas is an average value.
All this are indications. Only a timing analysis on the extracted transistor
  net-list from layout can tell if a cell is well used or not (see tas(1) for
  informations about static timing analysis).
BEHAVIOR¶
For most of cells, the user can deduce the cell behavior just by reading its
  name. That is very intuitive for 
inverter and more complex for and/or
  cells. For the last, the name gives the and/or tree structure. The input order
  for the VHDL interface component is always the alphabetic order.
inv           : inversor buffer
buf           : buffer
[ n]ts         : [not] tree-state
[ n]xr<i>      : [not] xor <i> inputs
[ n]mx<i>      : [not] multiplexor <i> inputs with coded command
[ n][sd]ff<i>  : [not] [static|dynamic] flip-flop <i> inputs
[ n]oa...      : [not] and/or function (see below)
and_or cell (YACC (1) grammar):-
NAME     :  n OA_CELL                 -> not OA_CELL
         | OA_CELL                   -> OA_CELL
OA_CELL  : OPERATOR INPUTS           -> function with INPUTS inputs
         | OPERATOR OA_CELLS INPUTS  -> function with INPUTS inputs
                                        where some inputs are OA_CELL
OPERATOR :  a                         -> and
         |  o                         -> or
         |  n                         -> not
OA_CELLS : OA_CELLS OA_CELL          -> list of OA_CELL
         | OA_CELL                   -> last OA_CELL of the list
INPUTS   :  integer                   -> number of inputs
The input names are implicit and formed that way  i<number>.
They are attributed in order beginning by  i0.
nx where x is a number means there are x inverters in parallel. For
example an23 is an  and with 3 inputs of which two are inverted, that
is  and( not(i0), not(i1), i2).
Examples:- (some are not in sxlib)
na2       : not( and(i0,i1))
on12      : or( not(i0), i1)
noa2a22   : not( or( and(i0,i1), and(i2,i3)))
noa23     : not( or( and(i0,i1), i3))
noao22a34 : not( or( and( or(i0,i1), i2), and(i3,i4,i5), i6, i7))
Note that xr2 could not be expressed with an and/or formulea even if
 
xr2 = or( and( not(i0), i1), and( not(i1), i0)) = oan12an122
 
but the input names are not well distributed.
CELL LIST¶
All available cells are listed below. The first column is the pitch width. The
  pitch value is 5 lambdas. The height is 50. Area is then <number>*5*50.
The second column is the output drive strenght compared with the 
inv_x1
  output drive strenght (see explanation above in section OUTPUT DRIVE).
The following column is the delay in nano-seconds. Remember this delay
  corresponds to the slower input+0.6ns (see explanation above in section DELAY
  MODEL).
The last column gives the function behavior with input capacitance. 
/
  means 
not, 
+ means 
or, 
. means 
and,
  
^ means 
xor. Each input is followed by fan-in capacitance in fF,
  (e.g. i0<11> means i0 pin capacitance is 11fF).
For some cells, such as 
fulladder, it was not possible to internally
  connect all inputs. That means there are several inputs that 
must be
  externally connected. In the following list, these inputs are followed by
  a star (*) character in the equation.
For example, fulladder equation is sout <= (a* . b* . cin*). a* replaces a0,
  a1, a2, a3 that must be explicitly connected by the user. Note also few cells
  have more than one output. In that case there are several lines in the list,
  one by output.
=================================================================
WIDTH NAME  DRIVE DELAY BEHAVIOR with cin
-------------------------------------------------------- INVERSOR
 3 inv_x1       1.0 0.7  nq <= /i<8>
 3 inv_x2       1.6 0.7  nq <= /i<12>
 4 inv_x4       3.6 0.7  nq <= /i<26>
 7 inv_x8       8.4 0.7  nq <= /i<54>
---------------------------------------------------------- BUFFER
 4 buf_x2       2.1 1.0   q <=  i<6>
 5 buf_x4       4.3 1.0   q <=  i<9>
 8 buf_x8       8.4 1.0   q <=  i<15>
------------------------------------------------------ THREE STATE
 6 nts_x1       1.2 0.8  IF (cmd<14>) nq <= /i<14>
 8 nts_x2       2.4 0.9  IF (cmd<18>) nq <= /i<28>
10 ts_x4        4.3 1.1  IF (cmd<19>)  q <= i<8>
13 ts_x8        8.4 1.2  IF (cmd<19>)  q <= i<8>
-------------------------------------------------------------- AND
 4 na2_x1       1.0 0.9  nq <= /(i0<11>.i1<11>)
 7 na2_x4       4.3 1.2  nq <= /(i0<10>.i1<10>)
 5 na3_x1       0.9 1.0  nq <= /(i0<11>.i1<11>.i2<11>)
 8 na3_x4       4.3 1.3  nq <= /(i0<10>.i1<10>.i2<10>)
 6 na4_x1       0.7 1.0  nq <= /(i0<10>.i1<11>.i2<11>.i3<11>)
10 na4_x4       4.3 1.4  nq <= /(i0<10>.i1<11>.i2<11>.i3<11>)
 5 a2_x2        2.1 1.0   q <=  (i0<9>.i1<11>)
 6 a2_x4        4.3 1.1   q <=  (i0<9>.i1<11>)
 6 a3_x2        2.1 1.1   q <=  (i0<10>.i1<10>.i2<10>)
 7 a3_x4        4.3 1.2   q <=  (i0<10>.i1<10>.i2<10>)
 7 a4_x2        2.1 1.2   q <=  (i0<10>.i1<10>.i2<10>.i3<10>)
 8 a4_x4        4.3 1.3   q <=  (i0<10>.i1<10>.i2<10>.i3<10>)
 5 an12_x1      1.0 1.0   q <=  (/i0<12>).i1<9>
 8 an12_x4      4.3 1.1   q <=  (/i0<9>).i1<11>
--------------------------------------------------------------- OR
 4 no2_x1       1.0 0.9  nq <= /(i0<12>+i1<12>)
 8 no2_x4       4.3 1.2  nq <= /(i0<12>+i1<11>)
 5 no3_x1       0.8 1.0  nq <= /(i0<12>+i1<12>+i2<12>)
 8 no3_x4       4.3 1.3  nq <= /(i0<12>+i1<12>+i2<11>)
 6 no4_x1       0.6 1.1  nq <= /(i0<12>+i1<12>+i2<12>+i3<12>)
10 no4_x4       4.3 1.4  nq <= /(i0<12>+i1<12>+i2<12>+i3<12>)
 5 o2_x2        2.1 1.0   q <=  (i0<10>+i1<10>)
 6 o2_x4        4.3 1.1   q <=  (i0<10>+i1<10>)
 6 o3_x2        2.1 1.1   q <=  (i0<10>+i1<10>+i2<9>)
10 o3_x4        4.3 1.2   q <=  (i0<10>+i1<10>+i2<9>)
 7 o4_x2        2.1 1.2   q <=  (i0<10>+i1<10>+i2<10>+i3<9>)
 8 o4_x4        4.3 1.3   q <=  (i0<12>+i1<12>+i2<12>+i3<12>)
 5 on12_x1      1.0 0.9   q <=  (/i0<11>)+i1<9>
 8 on12_x4      4.3 1.1   q <=  (/i0<9>)+i1<10>
--------------------------------------------------------- AND/OR 3
 6 nao22_x1     1.2 0.9  nq <= /((i0<14>+i1<14>).i2<14>)
10 nao22_x4     4.3 1.3  nq <= /((i0<8> +i1<8>) .i2<9>)
 6 noa22_x1     1.2 0.9  nq <= /((i0<14>.i1<14>)+i2<14>)
10 noa22_x4     4.3 1.3  nq <= /((i0<8> .i1<8>) +i2<9>)
 6 ao22_x2      2.1 1.2   q <=  ((i0<8>+i1<8>).i2<9>)
 8 ao22_x4      4.3 1.3   q <=  ((i0<8>+i1<8>).i2<9>)
 6 oa22_x2      2.1 1.2   q <=  ((i0<8>.i1<8>)+i2<9>)
 8 oa22_x4      4.3 1.3   q <=  ((i0<8>.i1<8>)+i2<9>)
--------------------------------------------------------- AND/OR 4
 7 nao2o22_x1   1.2 1.0  nq <= /((i0<14>+i1<14>).(i2<14>+i3<14>))
11 nao2o22_x4   4.3 1.4  nq <= /((i0<8> +i1<8>) .(i2<8> +i3<8>))
 7 noa2a22_x1   1.2 1.0  nq <= /((i0<14>.i1<14>)+(i2<14>.i3<14>))
11 noa2a22_x4   4.3 1.4  nq <= /((i0<8> .i1<8>) +(i2<8> .i3<8>))
 9 ao2o22_x2    2.1 1.2   q <=  ((i0<8>+i1<8>).(i2<8>+i3<8>))
10 ao2o22_x4    4.3 1.3   q <=  ((i0<8>+i1<8>).(i2<8>+i3<8>))
 9 oa2a22_x2    2.1 1.2   q <=  ((i0<8>.i1<8>)+(i2<8>.i3<8>))
10 oa2a22_x4    4.3 1.4   q <=  ((i0<8>.i1<8>)+(i2<8>.i3<8>))
--------------------------------------------------------- AND/OR 5
 7 noa2ao222_x1 0.7 1.1 nq <= /((i0<11>.i1<11>)+((i2<13>+i3<13>).i4<13>))
11 noa2ao222_x4 4.3 1.4 nq <= /((i0<11>.i1<11>)+((i2<11>+i3<11>).i4<11>))
10 oa2ao222_x2  2.1 1.2  q <=  ((i0<8> .i1<8>) +((i2<8> +i3<8>) .i4<8>))
11 oa2ao222_x4  4.3 1.3  q <=  ((i0<8> .i1<8>) +((i2<8> +i3<8>) .i4<8>))
--------------------------------------------------------- AND/OR 6
10 noa2a2a23_x1 0.8 1.2 nq <= /((i0<13>.i1<14>) +(i2<14>.i3<14>)
                               +(i4<14>.i5<14>))
13 noa2a2a23_x4 4.3 1.3 nq <= /((i0<13>.i1<14>) +(i2<14>.i3<14>)
                               +(i4<14>.i5<14>))
12 oa2a2a23_x2  2.1 1.4  q <=  ((i0<13>.i1<14>) +(i2<14>.i3<14>)
                               +(i4<14>.i5<14>))
13 oa2a2a23_x4  4.3 1.4  q <=  ((i0<13>.i1<14>) +(i2<14>.i3<14>)
                               +(i4<14>.i5<14>))
--------------------------------------------------------- AND/OR 7
 9 noa3ao322_x1 0.6 1.2 nq <= /((i0<13>.i1<13>.i2<12>)
                               +((i3<13>+i4<13>+i5<13>).i6<13>))
11 noa3ao322_x4 4.3 1.4 nq <= /((i0<10>.i1<9>.i2<9>)
                               +((i3<9>+i4<9>+i5<9>).i6<9>))
10 oa3ao322_x2  2.1 1.2  q <= /((i0<10>.i1<9>.i2<9>)
                               +((i3<9>+i4<9>+i5<9>).i6<9>))
11 oa3ao322_x4  4.3 1.3  q <= /((i0<10>.i1<9>.i2<9>)
                               +((i3<9>+i4<9>+i5<9>).i6<9>))
--------------------------------------------------------- AND/OR 8
14 noa2a2a2a24_x1 0.6 1.4 nq <= /((i0<14>.i1<14>)+(i2<13>.i3<13>)
                                 +(i4<13>.i5<13>)+(i6<14>.i7<14>))
17 noa2a2a2a24_x4 4.3 1.7 nq <= /((i0<14>.i1<14>)+(i2<14>.i3<13>)
                                 +(i4<13>.i5<13>)+(i6<14>.i7<14>))
15 oa2a2a2a24_x2  2.1 1.5  q <=  ((i0<14>.i1<14>)+(i2<14>.i3<13>)
                                 +(i4<13>.i5<13>)+(i6<14>.i7<14>))
16 oa2a2a2a24_x4  4.3 1.6  q <=  ((i0<14>.i1<14>)+(i2<14>.i3<13>)
                                 +(i4<13>.i5<13>)+(i6<14>.i7<14>))
------------------------------------------------------ MULTIPLEXER
 7 nmx2_x1      1.2 1.0  nq <= /((i0<14>./cmd<21>)+(i1<14>.cmd))
12 nmx2_x4      4.3 1.3  nq <= /((i0<8>./cmd<14>)+(i1<9>.cmd))
 9 mx2_x2       2.1 1.1   q <=   (i0<8>./cmd<17>)+(i1<9>.cmd)
10 mx2_x4       4.3 1.3   q <=   (i0<8>./cmd<17>)+(i1<9>.cmd)
12 nmx3_x1      0.4 1.2  nq <= /((i0<9>./cmd0<15>)
                                +(((i1<8>.cmd1<15>)+(i2<8>./cmd1)).cmd0))
15 nmx3_x4      4.3 1.7  nq <= /((i0<9>./cmd0<15>)
                                +(((i1<8>.cmd1<15>)+(i2<8>./cmd1)).cmd0))
13 mx3_x2       2.1 1.4   q <=  ((i0<9>./cmd0<15>)
                                +(((i1<8>.cmd1<15>)+(i2<8>./cmd1)).cmd0))
14 mx3_x4       4.3 1.6   q <=  ((i0<9>./cmd0<15>)
                                +(((i1<8>.cmd1<15>)+(i2<8>./cmd1)).cmd0))
-------------------------------------------------------------- XOR
 9 nxr2_x1      1.2 1.1  nq <= /(i0<21>^i1<22>)
11 nxr2_x4      4.3 1.2  nq <= /(i0<20>^i1<21>)
 9 xr2_x1       1.2 1.0   q <=  (i0<21>^i1<22>)
12 xr2_x4       4.3 1.2   q <=  (i0<20>^i1<21>)
-------------------------------------------------------- FLIP-FLOP
                            nq <=/((i0<11>./cmd<13>)+(i1<7>.cmd))
18 sff1_x4      4.3 1.7  IF RISE(ck<8>)
                             q <= i<8>
24 sff2_x4      4.3 1.9  IF RISE(ck<8>)
                             q <= ((i0<8>./cmd<16>)+(i1<7>.cmd))
28 sff3_x4      4.3 2.4  IF RISE(ck<8>)
                             q <= (i0<9>./cmd0<15>)
                                 +(((i1<8>.cmd1<15>)+(i2<8>./cmd1)).cmd0)
------------------------------------------------------------ ADDER
16 halfadder_x2 2.1 1.2 sout <= (a<27>^b<22>)
                2.1 1.0 cout <= (a.b)
18 halfadder_x4 4.3 1.3 sout <= (a<27>^b<22>)
                4.3 1.1 cout <= (a.b)
20 fulladder_x2 2.1 1.8 sout <= (a*<28>^b*<28>^cin*<19>)
                2.1 1.4 cout <= (a*.b*+a*.cin*+b*.cin*)
21 fulladder_x4 4.3 2.2 sout <= (a*<28>^b*<28>^cin*<19>)
                4.3 1.5 cout <= (a*.b*+a*.cin*+b*.cin*)
---------------------------------------------------------- SPECIAL
 3 zero_x0       0   0  nq <= '0'
 3 one_x0        0   0   q <= '1'
 2 tie_x0        0   0  Body tie cell
 1 rowend_x0     0   0  Empty cell
==================================================================
NEW CELLS¶
It is possible to add new cells in the library just by providing the 3 files
  .ap, .al and .vbe in the standard cell directory. The layout view can be
  created with the symbolic editor graal. The physical outline is given above.
  The net-list view can be automatically generated with the lynx extractor. The
  behavioral view must be written by the designer and checked with the yagle
  functional abstractor. The file must contain the generic fields in order to be
  used by the logic synthesis tools and the I/Os terminals must be in the same
  order (alphabetic) in the .vbe and .al files.
If you develop new cells, please send the corresponding files to
  alliance-users@asim.lip6.fr
VHDL FILES¶
You can find below the commented VHDL GENERIC for the na2_x4 cell.
ENTITY na2_x4 IS
GENERIC (
  CONSTANT area          : NATURAL := 1750; -- lamba * lambda
  CONSTANT transistors   : NATURAL := 10;   -- number of
  CONSTANT cin_i0        : NATURAL := 10;   -- femto Farad for i0
  CONSTANT cin_i1        : NATURAL := 10;   -- femto Farad for i1
  CONSTANT tplh_i1_nq    : NATURAL := 606;  -- propag. time in pico-sec
                                            -- from i1 falling
                                            -- to   nq rizing
  CONSTANT rup_i1_nq     : NATURAL := 890;  -- resitance in Ohms when nq
                                            -- rizing due to i1 change
  CONSTANT tphl_i1_nq    : NATURAL := 349;  -- propag time when nq falls
  CONSTANT rdown_i1_nq   : NATURAL := 800;  -- resist when nq falls
  CONSTANT tplh_i0_nq    : NATURAL := 557;  -- idem for i0
  CONSTANT rup_i0_nq     : NATURAL := 890;
  CONSTANT tphl_i0_nq    : NATURAL := 408;
  CONSTANT rdown_i0_nq   : NATURAL := 800
);
PORT (
  i0     : in  BIT;
  i1     : in  BIT;
  nq     : out BIT;
  vdd    : in  BIT;
  vss    : in  BIT
);
SEE ALSO¶
MBK_CATA_LIB (1), catal(1), ocp(1), nero(1), cougar(1), boom(1), loon(1),
  boog(1), genlib(1), ap(5), al(5), vbe(5)
BUG REPORT¶
This tool is under development at the 
ASIM department of the 
LIP6
  laboratory.
 
We need your feedback to improve documentation and tools.