Add my initial definitions of SRAM bits.
This commit is contained in:
parent
cf73ec9016
commit
b58f4df33e
242
final/SRAM_bits.cir
Normal file
242
final/SRAM_bits.cir
Normal file
|
@ -0,0 +1,242 @@
|
|||
* This file contains all the subcircuits to be used in SRAM256.cir
|
||||
|
||||
***** long channel VTP = -0.9, VTN = 0.8 *****
|
||||
*.include modelcard/1um.pm
|
||||
*.param supply = 5
|
||||
*.param ll = 1u
|
||||
|
||||
****** 50nm models***
|
||||
|
||||
|
||||
.include ./modelcard/50nm.pm
|
||||
.param supply =1
|
||||
|
||||
.param lambda=25nm
|
||||
.param ll='2*lambda'
|
||||
|
||||
****** 16nm low power models***
|
||||
*.include ./modelcard/PTM_LP/16nm.pm
|
||||
*.param supply =0.9
|
||||
*.param ll=16nm
|
||||
|
||||
****** 16nm high peformance models***
|
||||
*.include ./modelcard/PTM_HP/16nm.pm
|
||||
*.param supply =0.7
|
||||
*.param ll=16nm
|
||||
|
||||
|
||||
.subckt wire iot iof len=10 wid=10
|
||||
.param rr=0.8
|
||||
.param cc = '200e-15'
|
||||
rt iot iof 'rr*len*50/(wid)'
|
||||
cf iof 0 'cc*len*wid*50/1e6'
|
||||
|
||||
.ends
|
||||
|
||||
.subckt wire_dual lt rt lf rf len=10 wid=10
|
||||
Xt lt rt wire len='len' wid='wid'
|
||||
Xf lf rf wire len='len' wid='wid'
|
||||
.ends
|
||||
|
||||
.subckt nn d g s ww=100
|
||||
mnfet d g s 0 nmos L=ll w='ww*ll'
|
||||
.ends
|
||||
|
||||
.subckt pp d g s ww=100
|
||||
mpfet d g s vdd pmos L=ll w='ww*ll'
|
||||
.ends
|
||||
|
||||
|
||||
.subckt inv out inn size=30 beta=2
|
||||
XPP out inn vdd pp ww='size*beta/(beta+1)'
|
||||
XNN out inn gnd nn ww='size/(beta+1)'
|
||||
.ends
|
||||
|
||||
.subckt nnd2 out in1 in0 size=30 beta=2
|
||||
Xap0 out in0 vdd pp ww='beta*size/(beta+2)'
|
||||
Xap1 out in1 vdd pp ww='beta*size/(beta+2)'
|
||||
Xan0 out in0 nng nn ww='2*size/(beta+2)'
|
||||
Xan1 nng in1 0 nn ww='2*size/(beta+2)'
|
||||
.ends nnd2
|
||||
|
||||
.subckt nor2 out in1 in0 size=30 beta=2
|
||||
Xap0 ppi in0 vdd pp ww='2*beta*size/(2*beta+1)'
|
||||
Xap1 out in1 ppi pp ww='2*beta*size/(2*beta+1)'
|
||||
Xan0 out in0 0 nn ww='1*size/(2*beta+1)'
|
||||
Xan1 out in1 0 nn ww='1*size/(2*beta+1)'
|
||||
.ends nor2
|
||||
|
||||
.subckt latch out inn clk clb size=15 beta=2
|
||||
Xn inn clk qin nn ww='5'
|
||||
Xp inn clb qin pp ww='10'
|
||||
|
||||
Xfp qin ggg vdd pp ww='5'
|
||||
Xfn qin ggg gnd nn ww='5'
|
||||
|
||||
Xi ggg qin inv size='size'
|
||||
Xo out ggg inv size='3*size'
|
||||
.ends latch
|
||||
|
||||
.subckt flop qqq ddd clk
|
||||
Xinve clb clk inv
|
||||
Xflip int ddd clb clk latch
|
||||
Xflop qqq int clk clb latch
|
||||
.ends flop
|
||||
|
||||
.subckt reg8 ot7 ot6 ot5 ot4 ot3 ot2 ot1 ot0 in7 in6 in5 in4 in3 in2 in1 in0 clk
|
||||
x7 ot7 in7 clk flop
|
||||
x6 ot6 in6 clk flop
|
||||
x5 ot5 in5 clk flop
|
||||
x4 ot4 in4 clk flop
|
||||
x3 ot3 in3 clk flop
|
||||
x2 ot2 in2 clk flop
|
||||
x1 ot1 in1 clk flop
|
||||
x0 ot0 in0 clk flop
|
||||
.ends reg8
|
||||
|
||||
.subckt dat1 out period=1ns start=1ns sz=50 total=5 duty=3
|
||||
V0 j0 0 PULSE('supply' 0 'start' 10p 10p 'duty*period-10ps' 'total*period')
|
||||
x7 out j0 inv size='sz'
|
||||
.ends dat1
|
||||
|
||||
*generates different data stream on all eight channels, buffered output
|
||||
.subckt dat8 o7 o6 o5 o4 o3 o2 o1 o0 per=1ns start=1ns size=50
|
||||
V0 j0 0 PULSE(0 'supply' 'start' 10p 10p '0.5*per-10ps' 'per')
|
||||
V1 j1 0 PULSE(0 'supply' 'start' 10p 10p '0.5*per-10ps' '2*per')
|
||||
V2 j2 0 PULSE(0 'supply' 'start' 10p 10p '0.5*per-10ps' '3*per')
|
||||
V3 j3 0 PULSE(0 'supply' 'start' 10p 10p '0.5*per-10ps' '4*per')
|
||||
V4 j4 0 PULSE('supply' 0 'start' 10p 10p '0.5*per-10ps' '1*per')
|
||||
V5 j5 0 PULSE('supply' 0 'start' 10p 10p '1*per-10ps' '2*per')
|
||||
V6 j6 0 PULSE('supply' 0 'start' 10p 10p '1.5*per-10ps' '3*per')
|
||||
V7 j7 0 PULSE('supply' 0 'start' 10p 10p '2*per-10ps' '4*per')
|
||||
xb o7 o6 o5 o4 o3 o2 o1 o0 j7 j6 j5 j4 j3 j2 j1 j0 buf8 sz='size'
|
||||
.ends dat8
|
||||
|
||||
.subckt buf8 ot7 ot6 ot5 ot4 ot3 ot2 ot1 ot0 in7 in6 in5 in4 in3 in2 in1 in0 sz=100
|
||||
x7 ot7 in7 inv size='sz'
|
||||
x6 ot6 in6 inv size='sz'
|
||||
x5 ot5 in5 inv size='sz'
|
||||
x4 ot4 in4 inv size='sz'
|
||||
x3 ot3 in3 inv size='sz'
|
||||
x2 ot2 in2 inv size='sz'
|
||||
x1 ot1 in1 inv size='sz'
|
||||
x0 ot0 in0 inv size='sz'
|
||||
.ends buf8
|
||||
|
||||
|
||||
.subckt nnd3 out in2 in1 in0 size=20 beta=2
|
||||
Xp0 out in0 vdd pp ww='beta*size/(beta+3)'
|
||||
Xp1 out in1 vdd pp ww='beta*size/(beta+3)'
|
||||
Xp2 out in2 vdd pp ww='beta*size/(beta+3)'
|
||||
Xn0 out in0 nn0 nn ww='3*size/(beta+3)'
|
||||
Xn1 nn0 in1 nn1 nn ww='3*size/(beta+3)'
|
||||
Xn2 nn1 in2 gnd nn ww='3*size/(beta+3)'
|
||||
.ends
|
||||
|
||||
.subckt senseAmp ot1 ot0 in1 in0 eva size=40
|
||||
Xn0 ot0 in0 ot1 eva nnd3 size ='size'
|
||||
Xn1 ot1 in1 ot0 eva nnd3 size ='size'
|
||||
.ends senseAmp
|
||||
|
||||
|
||||
.subckt write1 btt bff dii rwt clk
|
||||
* TODO: sizes
|
||||
Xclk clkb clk inv
|
||||
Xdii diib dii inv
|
||||
Xrwn dorw clkb rwt nor2
|
||||
Xng pd dorw gnd nn ww='10'
|
||||
Xngt btt dii pd nn ww='10'
|
||||
Xngf bff diib pd nn ww='10'
|
||||
Xpct btt dorw vdd pp ww='10'
|
||||
Xpcf bff dorw vdd pp ww='10'
|
||||
.ends write1
|
||||
|
||||
|
||||
|
||||
.subckt read1 btt bff dot rwt clk
|
||||
Xnd trigger rwt clk nnd2
|
||||
Xinv triggerb trigger inv
|
||||
Xamp set reset btt bff triggerb senseAmp size='200'
|
||||
Xinv1 set1 set inv
|
||||
Xinv2 set2 set1 inv
|
||||
Xinv3 reset1 reset inv
|
||||
* Old setup:
|
||||
* Xp nn1 set2 vdd pp
|
||||
* Xn nn1 reset1 gnd nn
|
||||
* Xh1 dot nn1 inv
|
||||
* Xh2 nn1 dot inv
|
||||
Xp dot set2 vdd pp
|
||||
Xn dot reset1 gnd nn
|
||||
Xh1 dot nn1 inv
|
||||
Xh2 nn1 dot inv
|
||||
.ends read1
|
||||
|
||||
.subckt readSub btt bff set rst rwt clk
|
||||
Xnd trigger rwt clk nnd2
|
||||
Xinv triggerb trigger inv
|
||||
Xamp set rst btt bff triggerb senseAmp size='200'
|
||||
.ends read1
|
||||
|
||||
.subckt readcollect dot set0 rst0 set1 rst1 set2 rst2 set3 rst3
|
||||
Xset01 set01 set0 set1 nnd2
|
||||
Xset23 set23 set2 set3 nnd2
|
||||
Xrst01 rst01 rst0 rst1 nnd2
|
||||
Xrst23 rst23 rst2 rst3 nnd2
|
||||
Xnset01 nset01 set01 inv
|
||||
Xnset23 nset23 set23 inv
|
||||
Xp01 dot nset01 vdd pp
|
||||
Xp23 dot nset23 vdd pp
|
||||
Xn01 dot rst01 gnd nn
|
||||
Xn23 dot rst23 gnd nn
|
||||
Xh1 dot nn1 inv
|
||||
Xh2 nn1 dot inv
|
||||
.ends readCollect
|
||||
|
||||
|
||||
.subckt decode2 o11 o10 o01 o00 di1 di0 df1 df0
|
||||
|
||||
.ends
|
||||
|
||||
|
||||
.subckt decode_nor16
|
||||
|
||||
.ends
|
||||
|
||||
.subckt decode_nnd16
|
||||
|
||||
.ends
|
||||
|
||||
|
||||
.subckt decode_16and1
|
||||
|
||||
.ends decode_16and1
|
||||
|
||||
|
||||
.subckt dmux256 o255 o223 0012 o001 dt7 dt6 dt5 d4 dt3 dt1 dt0
|
||||
|
||||
.ends dmux256
|
||||
|
||||
|
||||
.subckt decModel choose din clk size='20'
|
||||
Xi1 nn1 din inv size='size'
|
||||
* Here: stopped using i1 and just used din
|
||||
Xnal ww1 gnd din nnd2 size='size'
|
||||
Xnar nn2 vdd din nnd2 size='size'
|
||||
Xnrl ww2 nn2 vdd nor2 size='size*3'
|
||||
Xnrr nn3 nn2 gnd nor2 size='size'
|
||||
Xna2l ww3 gnd nn3 nnd2 size='size*15'
|
||||
Xna2r nn4 vdd nn3 nnd2 size='size'
|
||||
Xi2 nn5 nn4 inv size='size'
|
||||
Xnac nn6 nn5 clk nnd2 size='size'
|
||||
Xi3 choose nn6 inv size='size'
|
||||
.ends
|
||||
|
||||
.subckt mem1 bt bf ope
|
||||
Xpt tt ff vdd pp ww='5'
|
||||
Xnt tt ff gnd nn ww='5'
|
||||
Xpf ff tt vdd pp ww='5'
|
||||
Xnf ff tt gnd nn ww='5'
|
||||
Xat bt ope tt nn ww='5'
|
||||
Xaf bf ope ff nn ww='5'
|
||||
.ends
|
||||
|
Loading…
Reference in New Issue
Block a user