D4516B DUAL UP-COUNTERS
*
* THE CMOS INTEGRATED CIRCUITS DATABOOK, 1983, RCA
* KN 9-9-92 REMODELED USING LOGICEXP, PINDLY, CONSTRAINT DEVICES
*
.SUBCKT CD4516B PS_EN_I RESET_I CLOCK_I UP/DOWN_I CINBAR_I P1_I P2_I P3_I P4_I
+ COUTBAR_O Q1_O Q2_O Q3_O Q4_O
+ OPTIONAL: VDD=$G_CD4000_VDD VSS=$G_CD4000_VSS
+ PARAMS: MNTYMXDLY=0 IO_LEVEL=0
*
UCD4516BLOG LOGICEXP(13,27) VDD VSS
+ PS_EN_I RESET_I CLOCK_I UP/DOWN_I CINBAR_I P1_I P2_I P3_I P4_I Q1 Q2 Q3 Q4
+ PS_EN RESET CLOCK UP/DOWN CINBAR P1 P2 P3 P4
+ COUTBAR T2 T3 T4 PRESET1 PRESET2 PRESET3 PRESET4 RESET1 RESET2 RESET3 RESET4
+ U1 U2 U3 U4 CLK CIN
+ D0_GATE IO_4000B IO_LEVEL={IO_LEVEL}
+ LOGIC:
* BUFFER:
+ PS_EN = { PS_EN_I }
+ RESET = { RESET_I }
+ CLOCK = { CLOCK_I }
+ UP/DOWN = { UP/DOWN_I }
+ CINBAR = { CINBAR_I }
+ P1 = { P1_I }
+ P2 = { P2_I }
+ P3 = { P3_I }
+ P4 = { P4_I }
+
* INTERMEDIATE TERMS:
+ RESETBAR = { ~RESET } ; UP/DOWN&Q2 AND UP/DOWN|Q2 CAN MINIMIZE
+ U1 = { ~(Q1 ^ UP/DOWN) & ~CINBAR }
+ U2 = { (UP/DOWN & Q2 & Q3 & Q4) | ~(UP/DOWN | Q2 | Q3 | Q4) }
+ U3 = { (UP/DOWN & Q2) | ~(UP/DOWN | Q2) }
+ U4 = { (UP/DOWN & Q2 & Q3) | ~(UP/DOWN | Q2 | Q3) }
+ CIN = { ~CINBAR }
+
* OUTPUT ASSIGNMENTS:
+ CLK = { ~(CLOCK | RESET | PS_EN) }
+ PRESET1 = { RESET | ~PS_EN | ~P1 }
+ PRESET2 = { RESET | ~PS_EN | ~P2 }
+ PRESET3 = { RESET | ~PS_EN | ~P3 }
+ PRESET4 = { RESET | ~PS_EN | ~P4 }
+ RESET1 = { RESETBAR & (~PS_EN | P1) }
+ RESET2 = { RESETBAR & (~PS_EN | P2) }
+ RESET3 = { RESETBAR & (~PS_EN | P3) }
+ RESET4 = { RESETBAR & (~PS_EN | P4) }
+ COUTBAR = { ~(U1 & U2) }
+ T2 = { U1 } ; T1 = CINBAR
+ T3 = { (U1 & U3) }
+ T4 = { (U1 & U4) }
+
*
U1 JKFF(1) VDD VSS PRESET1 RESET1 CLK
+ CIN CIN Q1 Q1BAR
+ D0_EFF IO_4000B
*
U2 JKFF(1) VDD VSS PRESET2 RESET2 CLK
+ T2 T2 Q2 Q2BAR
+ D0_EFF IO_4000B
*
U3 JKFF(1) VDD VSS PRESET3 RESET3 CLK
+ T3 T3 Q3 Q3BAR
+ D0_EFF IO_4000B
*
U4 JKFF(1) VDD VSS PRESET4 RESET4 CLK
+ T4 T4 Q4 Q4BAR
+ D0_EFF IO_4000B
*
UCD4516BDLY PINDLY (5,0,9) VDD VSS
+ Q1 Q2 Q3 Q4 COUTBAR
+ CLOCK CINBAR RESET PS_EN P1 P2 P3 P4 UP/DOWN
+ Q1_O Q2_O Q3_O Q4_O COUTBAR_O
+ IO_4000B MNTYMXDLY={MNTYMXDLY} IO_LEVEL={IO_LEVEL}
+
+ PINDLY:
+ Q1_O Q2_O Q3_O Q4_O = {
+ CASE(
+ CHANGED(RESET,0) | CHANGED(PS_EN,0), DELAY(-1,210NS,420NS),
+ CHANGED_LH(CLOCK,0), DELAY(-1,200NS,400NS),
+ DELAY(-1,211NS,421NS) ;DEFAULT
+ )
+ }
+
+ COUTBAR_O = {
+ CASE(
+ CHANGED(RESET,0) | CHANGED(PS_EN,0), DELAY(-1,320NS,640NS),
+ CHANGED_LH(CLOCK,0), DELAY(-1,240NS,480NS),
+ CHANGED(CINBAR,0), DELAY(-1,125NS,250NS),
+ DELAY(-1,321NS,641NS) ;DEFAULT
+ )
+ }
+
+
+ FREQ:
+ NODE = CLOCK
+ MAXFREQ = 2MEG
+
+ WIDTH:
+ NODE = CLOCK
+ MIN_HI = 150NS
+ MIN_LO = 150NS
+
+ WIDTH:
+ NODE = RESET
+ MIN_HI = 220NS
+ MIN_LO = 220NS
+
+ WIDTH:
+ NODE = PS_EN
+ MIN_HI = 220NS
+ MIN_LO = 220NS
+
+ SETUP_HOLD:
+ DATA(1) = CINBAR
+ CLOCK LH = CLOCK
+ SETUPTIME = 130NS
+ HOLDTIME = 60NS
+ WHEN = { PS_EN!='1 & RESET!='1 }
+
+ SETUP_HOLD:
+ DATA(1) = UP/DOWN
+ CLOCK LH = CLOCK
+ SETUPTIME = 360NS
+ HOLDTIME = 30NS
+ WHEN = { PS_EN!='1 & RESET!='1 & CINBAR!='1 }
+
+ SETUP_HOLD:
+ DATA(1) = PS_EN
+ CLOCK LH = CLOCK
+ RELEASETIME_HL = 150NS
+
+ SETUP_HOLD:
+ DATA(1) = RESET
+ CLOCK LH = CLOCK
+ RELEASETIME_HL = 150NS
+
+ SETUP_HOLD:
+ DATA(4) = P1 P2 P3 P4 ; CHECK SETUPTIME PS_EN TO Pn
+ CLOCK HL = PS_EN
+ SETUPTIME = 70NS
+ WHEN = { RESET!='1 & CINBAR!='1 }
+ MESSAGE = "SETUPTIME PRESET_ENABLE TO Pn TOO SHORT"
+
+ SETUP_HOLD:
+ DATA(4) = P1 P2 P3 P4 ; CHECK HOLDTIME PS_EN TO Pn
+ CLOCK LH = PS_EN
+ HOLDTIME = 25NS
+ WHEN = { RESET!='1 & CINBAR!='1 }
+ MESSAGE = "HOLDTIME PRESET_ENABLE TO Pn TOO SHORT"
*
.ENDS
*
*$