Source code for jitxlib.voltage_divider.circuit
import warnings
from typing import Optional
from jitx.component import Component
from jitx.circuit import Circuit
from jitx.inspect import decompose
from jitx.net import Net, Port
from jitx.toleranced import Toleranced
from jitxlib.parts.convert import convert_component
from .solver import VoltageDividerSolution, solve
from .constraints import VoltageDividerConstraints
from .inverse import InverseDividerConstraints
[docs]
class VoltageDividerCircuit(Circuit):
"""
Circuit for a voltage divider solution.
Ports: hi, out, lo
Instances: r_hi, r_lo
"""
hi: Port
out: Port
lo: Port
# Make those jitxlib.parts.Resistors for typed attribute accessing.
r_hi: Component
r_lo: Component
nets: list[Net]
output_voltage: Toleranced
def __init__(self, sol: VoltageDividerSolution):
# Ports
self.hi = Port()
self.out = Port()
self.lo = Port()
# Resistor instances
self.r_hi = convert_component(sol.R_h.component, component_name="r_hi")()
self.r_lo = convert_component(sol.R_l.component, component_name="r_lo")()
# Nets (connections)
h_p1, h_p2 = decompose(self.r_hi, Port)
l_p1, l_p2 = decompose(self.r_lo, Port)
self.nets = [h_p1 + self.hi, h_p2 + l_p1 + self.out, l_p2 + self.lo]
# FIXME: Properties are a concept of JITX ESIR interface and don't have a port in the python interface.
self.output_voltage = sol.vo
def _warn_name_ignored(name: Optional[str]) -> None:
if name is not None:
warnings.warn(
"The `name` argument is deprecated and ignored; the circuit is "
"always named 'VoltageDividerCircuit'.",
DeprecationWarning,
stacklevel=3,
)
[docs]
def voltage_divider(
sol: VoltageDividerSolution, name: Optional[str] = None
) -> VoltageDividerCircuit:
"""
Construct a voltage divider circuit from a solution.
.. deprecated::
The `name` argument is deprecated and ignored.
"""
_warn_name_ignored(name)
return VoltageDividerCircuit(sol)
[docs]
def voltage_divider_from_constraints(
cxt: VoltageDividerConstraints, name: Optional[str] = None
) -> VoltageDividerCircuit:
"""
Construct a voltage divider circuit from constraints (forward or inverse).
"""
sol = solve(cxt)
return voltage_divider(sol, name=name)
[docs]
def forward_divider(
v_in: Toleranced, v_out: Toleranced, current: float, name: Optional[str] = None
) -> VoltageDividerCircuit:
"""
Construct a forward voltage divider circuit from basic parameters.
"""
cxt = VoltageDividerConstraints(v_in=v_in, v_out=v_out, current=current)
return voltage_divider_from_constraints(cxt, name=name)
[docs]
def inverse_divider(
v_in: Toleranced, v_out: Toleranced, current: float, name: Optional[str] = None
) -> VoltageDividerCircuit:
"""
Construct an inverse voltage divider circuit from basic parameters.
"""
cxt = InverseDividerConstraints(v_in=v_in, v_out=v_out, current=current)
return voltage_divider_from_constraints(cxt, name=name)