| This file contains a description of an I/O buffer.
|
|*********************************************************************
[Define Model]  I/O_open_sink  (control IO_pad enable pullup_ref pulldown_ref power_clamp_ref gnd_clamp_ref gnd)
|---------------------------------------------------------------------
.define VT = 0.86e-4 * [Temperature Range] || 0.026
|---------------------------------------------------------------------
.if (Polarity == Inverting)
  .trigger  switch_hi	(V(IO_pad) < [Model_Spec]Pulse_low ||
			V(IO_pad) < ([Model_Spec]Vmeas || Vmeas)
					for [Model_Spec]Pulse_time || 0)
  .trigger  switch_lo	(V(IO_pad) > [Model_Spec]Pulse_high ||
			V(IO_pad) > ([Model_Spec]Vmeas || Vmeas)
					for [Model_Spec]Pulse_time || 0)
.else
  .assert (Polarity == Non-Inverting || !Polarity)
  .trigger  switch_hi	(V(IO_pad) > [Model_Spec]Pulse_high ||
			V(IO_pad) > ([Model_Spec]Vmeas || Vmeas)
					for [Model_Spec]Pulse_time || 0)
  .trigger  switch_lo	(V(IO_pad) < [Model_Spec]Pulse_low ||
			V(IO_pad) < ([Model_Spec]Vmeas || Vmeas)
					for [Model_Spec]Pulse_time || 0)
.endif
|---------------------------------------------------------------------
.alarm    failure	(V(IO_pad) > D_overshoot_high ||
			V(IO_pad) < D_overshoot_low  ||
			V(IO_pad) > S_overshoot_high for D_overshoot_time ||
			V(IO_pad) < S_overshoot_low  for D_overshoot_time ||
			never)
|---------------------------------------------------------------------
.export switch_hi, switch_lo, failure
|*** Keywords not covered: Vinl, Vinh, Vinh+, Vinh-, Vinl+, Vinl-
|*** Reason: too much typing.  Just more triggers and exports.
|---------------------------------------------------------------------
.correlate fast/slow=min/max   C*, L*, TT*
.correlate strong/weak=min/max R*, *Clamp, Voltage_Range
.correlate strong/weak=max/min *Reference
|---------------------------------------------------------------------
.local pullup_ref
.local power_clamp_ref
.local pulldown_ref
.local gnd_clamp_ref

V puref    (pullup_ref gnd)         V = [Pullup Reference]      || [Voltage Range]
V pcref    (power_clamp_ref gnd)    V = [POWER Clamp Reference] || [Voltage Range]
V pdref    (pulldown_ref gnd)       V = [Pulldown Reference]    || short
V gcref    (gnd_clamp_ref gnd)      V = [GND Clamp Reference]   || short

C Ccomp_pu (IO_pad pullup_ref)      C = C_comp/4
C Ccomp_pc (IO_pad power_clamp_ref) C = C_comp/4
C Ccomp_pd (IO_pad pulldown_ref)    C = C_comp/4
C Ccomp_gc (IO_pad gnd_clamp_ref)   C = C_comp/4

C TTpwr    (IO_pad power_clamp_ref) C = TTpower * [POWER Clamp](-V(IO_pad power_clamp_ref)) / VT || open
C TTgnd    (IO_pad gnd_clamp_ref)   C = TTgnd * [GND Clamp](V(IO_pad power_clamp_ref)) / VT      || open

I pc  (IO_pad power_clamp_ref) I = [POWER Clamp](V(power_clamp_ref IO_pad))
I gc  (IO_pad gnd_clamp_ref)   I = [GND Clamp](V(IO_pad power_clamp_ref))
I pd  (IO_pad gnd_clamp_ref)   I = 

(V(pullup_ref pulldown_ref)/([Vpower] || ([Pullup Reference]-[Pulldown Reference])))

*[Pulldown](IO_pad pulldown_ref)

*([Falling Waveform]1(V_fixture)-[Falling Waveform]1(Time???)
|| [Rising Waveform]1(V_fixture)-[Rising Waveform]1(Time???))

/([Falling Waveform]1(R_fixture)

*[Pulldown]([Falling Waveform]1(Time???) || [Rising Waveform]1(Time???)))

-I(Cwav_pd)

V c_comp (c_comp gnd)  V = [Pulldown]([Falling Waveform]1(Time???) || [Rising Waveform]1(Time???))
C c_comp (c_comp gnd)  C = C_comp
|---------------------------------------------------------------------
.array Add_Submodel
  .if ($1 == Non_Driving)
    .local sm_enable
    .inverter U1 (sm_enable gnd en)
  .else if ($1 == All)
    .local sm_enable
    .dsource U2 (sm_enable gnd) 1
  .else
    .assert ($1 == Driving)
    .define sm_enable en
  .endif
  X$0 (en=sm_enable ...) $0
.endarray
|---------------------------------------------------------------------
[End Define Model]
|*********************************************************************
