********************************************************************************
********************************************************************************
*** Handy library of JSim circuits for Beta                    - 4/03 Steve Ward
********************************************************************************
********************************************************************************

*** .include "../6004Labs/nominal.jsim"
*** .include "../6004Labs/stdcell.jsim"

********************************************************************************
*** Test setup: generates 100-ns clock, reset signals:
********************************************************************************

.subckt gen_clk_and_reset clk reset nreset
Vclk clk 0 pulse(3.3,0,49.9ns,.1ns,.1ns,49.9ns)
Vreset reset 0 pwl(0ns 3.3v, 101ns 3.3v, 101.1ns 0v)
Xnreset reset nreset inverter
.ends


********************************************************************************
*** 'connect' circuit: connects its argument nodes.
*** This allows connection of buses, eg via
***    Xbus A[31:0] B[31:0] connect
********************************************************************************
.subckt connect a b
.connect a b
.ends


********************************************************************************
*** 5-input NAND gate... useful for detecting R31:
********************************************************************************
.subckt nand5 a b c d e out
Xa a b c x nand3
Xb d e y   nand2
Xc x y out or2
.ends


********************************************************************************
*** 1-bit incrementer... 
********************************************************************************

.subckt incbit cin cout bitin bitout
Xcout bitin cin cout and2
Xibit bitin cin bitout xor2 
.ends

********************************************************************************
*** Counters.
********************************************************************************

***
*** Cascadable ripple-carry counter bit.
***   nreset: active LOW reset (clear)
***      clk: 0->1 edge is active
***
.subckt counter1 cin cout clk nreset bitout
Xreg newbit clk bitout dreg
Xinc cin cout bitout bit1 incbit
Xres bit1 nreset newbit and2
.ends

***
*** 8-bit counter:
***
.subckt counter8 clk nreset ctr[7:0]
Xctr ctrco[6:0] vdd ctrco[7:0] clk#8 nreset#8 ctr[7:0] counter1
.ends


********************************************************************************
*** Full Adder bit (ripple carry):
********************************************************************************

.subckt FA a b cin s cout
Xg1 a b gn NAND2
Xp1 a b pn XNOR2
Xinv cin cinn inverter
Xxor cinn pn s XOR2
Xoai22 pn cinn gn cout OAI21
.ends

********************************************************************************
*** 32-bit adder:
********************************************************************************

.subckt add32 A[31:0] B[31:0] SUM[31:0]
Xfa A[31:0] B[31:0] co[30:0] 0 SUM[31:0] co[31:0] FA
.ends

