sycan.components.active.mosfet_4t

Four-terminal segmented MOSFET — L1 strong inversion + matched weak-inversion tail, polarity-aware (NMOS / PMOS), with the bulk node exposed and a long-channel body-effect correction on the threshold.

This is the canonical implementation; the three-terminal cell NMOS_3T / PMOS_3T is a thin wrapper that ties the bulk to the source so the body effect drops out.

Equations

Threshold with body effect (long-channel form):

V_TH(V_SB) = V_TH0 + γ * (sqrt(2 φ_F + V_SB) − sqrt(2 φ_F))

with V_SB the polarity-aware source-to-bulk voltage, γ = gamma the body-effect coefficient (units √V), and 2 φ_F = phi the surface potential at strong inversion (default 0.7 V). Setting gamma = 0 (the default) makes the body terminal cosmetic — it still appears as a port, but it does not feed back into V_TH.

Drain current uses the same segmented form as MOSFET_3T:

  • V_GS_eff >= V_off — Shichman-Hodges Level 1 (saturation + triode, with optional channel-length modulation λ).

  • V_GS_eff <  V_off — exponential tail joined C¹-smooth at the boundary V_off = V_TH + 2 m V_T with prefactor I_off = 2 β (m V_T)².

The body effect enters through V_TH, so the strong/weak boundary, the L1 saturation knee, and the weak-inversion exponential offset all shift consistently with V_SB.

Classes

NMOS_3T(name, drain, gate, source, mu_n, ...)

NMOS_4T with the bulk tied to the source.

NMOS_4T(name, drain, gate, source, bulk, ...)

Four-terminal segmented L1 + matched-weak-inversion NMOS.

PMOS_3T(name, drain, gate, source, mu_n, ...)

PMOS_4T with the bulk tied to the source.

PMOS_4T(name, drain, gate, source, bulk, ...)

Four-terminal segmented L1 + matched-weak-inversion PMOS (V_TH0 is a positive magnitude).

class sycan.components.active.mosfet_4t.NMOS_4T(name, drain, gate, source, bulk, mu_n, Cox, W, L, V_TH0, lam=<factory>, gamma=<factory>, phi=<factory>, m=<factory>, V_T=<factory>, C_gs=<factory>, C_gd=<factory>, V_GS_op=None, V_DS_op=None, V_BS_op=None, KF=<factory>, AF=<factory>, EF=<factory>, *, include_noise=None)[source]

Bases: _MOSFET_4T

Four-terminal segmented L1 + matched-weak-inversion NMOS.

Parameters:
  • name (str)

  • drain (str)

  • gate (str)

  • source (str)

  • bulk (str)

  • mu_n (Expr)

  • Cox (Expr)

  • W (Expr)

  • L (Expr)

  • V_TH0 (Expr)

  • lam (Expr)

  • gamma (Expr)

  • phi (Expr)

  • m (Expr)

  • V_T (Expr)

  • C_gs (Expr)

  • C_gd (Expr)

  • V_GS_op (Expr | None)

  • V_DS_op (Expr | None)

  • V_BS_op (Expr | None)

  • KF (Expr)

  • AF (Expr)

  • EF (Expr)

  • include_noise (None | str | list[str] | tuple[str, ...] | frozenset[str])

polarity: ClassVar[str] = 'N'
class sycan.components.active.mosfet_4t.PMOS_4T(name, drain, gate, source, bulk, mu_n, Cox, W, L, V_TH0, lam=<factory>, gamma=<factory>, phi=<factory>, m=<factory>, V_T=<factory>, C_gs=<factory>, C_gd=<factory>, V_GS_op=None, V_DS_op=None, V_BS_op=None, KF=<factory>, AF=<factory>, EF=<factory>, *, include_noise=None)[source]

Bases: _MOSFET_4T

Four-terminal segmented L1 + matched-weak-inversion PMOS (V_TH0 is a positive magnitude).

Parameters:
  • name (str)

  • drain (str)

  • gate (str)

  • source (str)

  • bulk (str)

  • mu_n (Expr)

  • Cox (Expr)

  • W (Expr)

  • L (Expr)

  • V_TH0 (Expr)

  • lam (Expr)

  • gamma (Expr)

  • phi (Expr)

  • m (Expr)

  • V_T (Expr)

  • C_gs (Expr)

  • C_gd (Expr)

  • V_GS_op (Expr | None)

  • V_DS_op (Expr | None)

  • V_BS_op (Expr | None)

  • KF (Expr)

  • AF (Expr)

  • EF (Expr)

  • include_noise (None | str | list[str] | tuple[str, ...] | frozenset[str])

polarity: ClassVar[str] = 'P'
class sycan.components.active.mosfet_4t.NMOS_3T(name, drain, gate, source, mu_n, Cox, W, L, V_TH, **kwargs)[source]

Bases: NMOS_4T

NMOS_4T with the bulk tied to the source.

Equivalent to NMOS_4T(..., bulk=source, V_TH0=V_TH, ...) — the constructor just supplies bulk = source for you and accepts V_TH as a friendlier name for the zero-bias threshold. All the rest of the model — port set, DC equations, AC stamps, body-effect plumbing (with V_SB ≡ 0), noise sources — is inherited verbatim, so a 3T instance is genuinely a 4T whose body is shorted out.

Callers wanting body effect should pass gamma > 0 to NMOS_4T directly with a distinct bulk node.

Parameters:
  • name (str)

  • drain (str)

  • gate (str)

  • source (str)

  • mu_n (Expr)

  • Cox (Expr)

  • W (Expr)

  • L (Expr)

property V_TH: Expr

Alias for V_TH0 — kept for backwards compatibility with the original (pre-4T) MOSFET_3T API.

class sycan.components.active.mosfet_4t.PMOS_3T(name, drain, gate, source, mu_n, Cox, W, L, V_TH, **kwargs)[source]

Bases: PMOS_4T

PMOS_4T with the bulk tied to the source. See NMOS_3T for the rationale; identical wrapper, opposite polarity.

Parameters:
  • name (str)

  • drain (str)

  • gate (str)

  • source (str)

  • mu_n (Expr)

  • Cox (Expr)

  • W (Expr)

  • L (Expr)

property V_TH: Expr