* Giux-Lab CalcLab Demo Collection
* Demo 02 - NE555 transistor-level discrete timer
* Test: astable multivibrator, transient analysis
*
* This is a flattened transistor-level 555 topology adapted for ngspice
* from the classic LM/NE555 internal transistor schematic and published
* educational transistor-level implementations.
*
* Important CalcLab compatibility choices:
* - no generic '+' continuation after .measure
* - no .measure PARAM='expression'
* - no BJT AREA multiplier after model name
* - three-terminal BJT syntax only
*
* SPDX-License-Identifier: GPL-3.0-or-later
* GNU GPL v3

* ============================================================
* FUTURE CALCLAB VIEWER PRESET METADATA
* Currently harmless comments. Intended for the planned feature.
* ============================================================

* CALCLAB_PANE 1 V(NE555_OUT) V(NE555_TIMING)
* CALCLAB_PANE 2 V(NE555_CONTROL) V(NE555_REF_1_3)
* CALCLAB_PANE 3 V(NE555_CMP_THRESHOLD) V(NE555_CMP_TRIGGER)
* CALCLAB_PANE 4 V(NE555_LATCH_A) V(NE555_LATCH_B) V(NE555_DISCHARGE)


* ============================================================
* SUPPLY
*
* Power-up is deliberately simulated rather than starting at 12 V.
* UIC is used so the transient starts from the physical power-up event.
* ============================================================

VCCSUP VCC 0 PULSE(0 12 1m 100u 100u 10 20)


* ============================================================
* EXTERNAL ASTABLE CONNECTIONS
*
* Standard 555 astable:
*
*   RA = 10 kOhm
*   RB = 100 kOhm
*   CT = 1 uF
*
* Ideal first-order estimate:
*
*   T ~= 0.693 * (RA + 2*RB) * CT
*     ~= 145.5 ms
*
*   f ~= 6.87 Hz
*
* The transistor-level model will not be perfectly ideal.
* ============================================================

RA VCC NE555_DISCHARGE 10k
RB NE555_DISCHARGE NE555_TIMING 100k
CT NE555_TIMING 0 1u

* Trigger and threshold are tied together in astable operation.
RTRIG NE555_TIMING NE555_TRIGGER 1m
RTHRESH NE555_TIMING NE555_THRESHOLD 1m

* Reset held high.
RRESET VCC NE555_RESET 10

* Control-voltage bypass capacitor.
CCONTROL NE555_CONTROL 0 10n

* Output load.
RLOAD NE555_OUT 0 10k
CLOAD NE555_OUT 0 100p


* ============================================================
* INTERNAL 555 REFERENCE DIVIDER
*
* Three nominal 5 kOhm resistors establish:
*
*   NE555_REF_1_3  ~= 1/3 VCC
*   NE555_CONTROL  ~= 2/3 VCC
*
* The CONTROL node is the actual control-voltage pin.
* ============================================================

R555_R3 VCC NE555_CONTROL 5k
R555_R4 NE555_CONTROL NE555_REF_1_3 5k
R555_R5 NE555_REF_1_3 0 5k


* ============================================================
* THRESHOLD COMPARATOR SECTION
* ============================================================

Q555_Q1 NE555_CMP_THRESHOLD NE555_THRESH_E1 NE555_CMP_COMMON QN
Q555_Q2 NE555_CMP_THRESHOLD NE555_THRESHOLD NE555_THRESH_E1 QN

Q555_Q7 NE555_CMP_THRESHOLD NE555_CMP_THRESHOLD NE555_BIAS_THRESHOLD QP
Q555_Q8 NE555_LATCH_A NE555_CMP_THRESHOLD NE555_BIAS_LATCH QP

R555_R1 NE555_CMP_COMMON 0 10k
R555_R13 VCC NE555_BIAS_THRESHOLD 4.7k


* ============================================================
* TRIGGER COMPARATOR SECTION
* ============================================================

Q555_Q3 NE555_CMP_TRIGGER NE555_TRIG_E1 NE555_CMP_COMMON QN
Q555_Q4 NE555_CMP_TRIGGER NE555_CONTROL NE555_TRIG_E1 QN

Q555_Q5 NE555_CMP_TRIGGER NE555_CMP_TRIGGER NE555_BIAS_TRIGGER QP
Q555_Q6 0 NE555_CMP_TRIGGER NE555_BIAS_LATCH QP

R555_R14 VCC NE555_BIAS_TRIGGER 4.7k
R555_R15 VCC NE555_BIAS_LATCH 830


* ============================================================
* LATCH / INTERNAL LOGIC
* ============================================================

Q555_Q9 NE555_LOGIC_1 NE555_BIAS_MASTER NE555_BIAS_RESET QP
R555_R2 VCC NE555_BIAS_RESET 1k

Q555_Q10 NE555_RESET_COL NE555_RESET_BASE NE555_LOGIC_1 QP
Q555_Q11 0 NE555_REF_1_3 NE555_RESET_BASE QP
Q555_Q12 NE555_LATCH_B NE555_TRIG_BASE NE555_LOGIC_1 QP
Q555_Q13 0 NE555_TRIGGER NE555_TRIG_BASE QP

R555_R16 NE555_LATCH_B 0 100k
R555_R17 NE555_RESET_COL 0 100k

Q555_Q17 NE555_LATCH_SET NE555_LATCH_A 0 QN
Q555_Q18 NE555_LATCH_A NE555_LATCH_B 0 QN
Q555_Q19 NE555_OUTPUT_CONTROL NE555_LATCH_SET 0 QN

Q555_Q23 NE555_BIAS_MASTER NE555_BIAS_MASTER VCC QP
Q555_Q25 NE555_OUTPUT_CONTROL NE555_BIAS_MASTER VCC QP

R555_R7 NE555_OUTPUT_CONTROL NE555_LATCH_A 4.7k


* ============================================================
* RESET AND DISCHARGE SECTION
* ============================================================

Q555_Q26 NE555_DISCH_BASE NE555_RESET NE555_RESET_DIODE QP
Q555_Q27 NE555_DISCHARGE NE555_DISCH_BASE 0 QN

D555_D1 NE555_RESET_DIODE NE555_LATCH_SET D555
R555_R18 NE555_BIAS_MASTER NE555_RESET_DIODE 5k


* ============================================================
* OUTPUT DRIVER
* ============================================================

Q555_Q28 NE555_OUTPUT_PRE NE555_OUTPUT_CONTROL NE555_OUTPUT_EMITTER QN

R555_R8 VCC NE555_OUTPUT_PRE 6.8k
R555_R9 NE555_OUTPUT_EMITTER NE555_DISCH_BASE 100
R555_R10 NE555_OUTPUT_EMITTER 0 4.7k

R555_R11 NE555_OUTPUT_BASE NE555_OUTPUT_EMITTER 220

Q555_Q29 NE555_OUT NE555_OUTPUT_BASE 0 QN
Q555_Q30 VCC NE555_OUTPUT_TOP NE555_OUT QN
Q555_Q31 VCC NE555_OUTPUT_PRE NE555_OUTPUT_TOP QN

R555_R12 NE555_OUTPUT_TOP NE555_OUT 3.9k

D555_D2 NE555_OUT NE555_OUTPUT_PRE D555


* ============================================================
* DEVICE MODELS
*
* Deliberately simple integrated-BJT style models.
* ============================================================

.model QN NPN(BF=125 VAF=100 CJE=0.5p CJC=0.5p RB=500)
.model QP PNP(BF=25 VAF=50 CJE=0.3p CJC=1.5p RB=250)
.model D555 D(IS=1e-12 CJO=1p RS=5)


* ============================================================
* TRANSIENT ANALYSIS
*
* Simulation begins at t=0.
* Supply rises at t=1 ms.
*
* Data retained:
*   20 ms -> 2.020 s
*   exactly 2.000 s of useful waveform
*
* Requested output spacing = 20 us
* Maximum internal timestep = 100 us
* ============================================================

.tran 20u 2.020 20m 100u uic


* ============================================================
* DEMO 02 V2 CORRECTION NOTE
*
* File that exposed the issue:
*   demo_02_ne555_discrete_astable_tran_v1.cir
*
* HIGH_TIME_2 and LOW_TIME_2 in v1 used mismatched independent
* RISE/FALL edge counts while the output starts HIGH. ngspice
* therefore correctly returned a negative HIGH_TIME_2.
* This is a demo-netlist measurement-indexing error, not a CalcLab bug.
* v2 pairs RISE=2 with FALL=3, then FALL=3 with RISE=3.
* ============================================================

* ============================================================
* MEASUREMENTS
*
* No PARAM expressions are used: CalcLab currently rejects them.
* TRIG/TARG measurements are kept on one physical line because
* generic '+' continuations after .measure are currently misparsed.
* ============================================================

.measure TRAN OUT_MAX MAX V(NE555_OUT) FROM=20m TO=2.020
.measure TRAN OUT_MIN MIN V(NE555_OUT) FROM=20m TO=2.020
.measure TRAN OUT_PP PP V(NE555_OUT) FROM=20m TO=2.020
.measure TRAN OUT_AVG AVG V(NE555_OUT) FROM=20m TO=2.020
.measure TRAN OUT_RMS RMS V(NE555_OUT) FROM=20m TO=2.020

.measure TRAN TIMING_MAX MAX V(NE555_TIMING) FROM=20m TO=2.020
.measure TRAN TIMING_MIN MIN V(NE555_TIMING) FROM=20m TO=2.020
.measure TRAN TIMING_PP PP V(NE555_TIMING) FROM=20m TO=2.020
.measure TRAN TIMING_MAX_SS MAX V(NE555_TIMING) FROM=300m TO=2.020
.measure TRAN TIMING_MIN_SS MIN V(NE555_TIMING) FROM=300m TO=2.020

.measure TRAN CONTROL_AVG AVG V(NE555_CONTROL) FROM=20m TO=2.020
.measure TRAN REF_1_3_AVG AVG V(NE555_REF_1_3) FROM=20m TO=2.020

.measure TRAN OUT_AT_100M FIND V(NE555_OUT) AT=100m
.measure TRAN TIMING_AT_100M FIND V(NE555_TIMING) AT=100m

* Period between the second and third rising edges.
.measure TRAN PERIOD_2_3 TRIG V(NE555_OUT) VAL=6 RISE=2 TARG V(NE555_OUT) VAL=6 RISE=3

* High and low times around the second complete cycle.
.measure TRAN HIGH_TIME_2 TRIG V(NE555_OUT) VAL=6 RISE=2 TARG V(NE555_OUT) VAL=6 FALL=3
.measure TRAN LOW_TIME_2 TRIG V(NE555_OUT) VAL=6 FALL=3 TARG V(NE555_OUT) VAL=6 RISE=3

* Supply current. SPICE source-current sign may be negative.
.measure TRAN ICC_AVG AVG I(VCCSUP) FROM=20m TO=2.020


* ============================================================
* RECOMMENDED WAVEFORM VIEWER TRACES
*
* Primary pane:
*   NE555_OUT
*   NE555_TIMING
*
* Reference pane:
*   NE555_CONTROL
*   NE555_REF_1_3
*
* Comparator pane:
*   NE555_CMP_THRESHOLD
*   NE555_CMP_TRIGGER
*
* Logic / discharge pane:
*   NE555_LATCH_A
*   NE555_LATCH_B
*   NE555_DISCHARGE
*
* Output-driver pane:
*   NE555_OUTPUT_CONTROL
*   NE555_OUTPUT_PRE
*   NE555_OUTPUT_TOP
*   NE555_OUT
* ============================================================

.end
