Source code for jitxlib.voltage_divider.circuit

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 _voltage_divider_instantiable( name: Optional[str] = None, ) -> type[VoltageDividerCircuit]: """ Construct a voltage divider circuit instantiable from a solution. The returned class will have the type name set to `name` if provided. """ base_class = VoltageDividerCircuit if name is not None: # Dynamically create a subclass with the given name return type(name, (VoltageDividerCircuit,), {}) else: return base_class
[docs] def voltage_divider( sol: VoltageDividerSolution, name: Optional[str] = None ) -> VoltageDividerCircuit: """ Construct a voltage divider circuit from a solution. The returned class will be an instantiable subclass of VoltageDividerCircuit. The returned class will have the type name set to `name` if provided. """ return _voltage_divider_instantiable(name)(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)