from typing import List, Union
from . import (
Terminal,
SubCircuitElement,
)
from ..analog_frontend import AnalogFrontend
from ..digital_control import DigitalControl as NominalDigitalControl
from ..digital_control.dither_control import DitherControl as NominalDitherControl
from .digital_control import DigitalControl, DitherControl, MultiPhaseDigitalControl
from ..analog_system import AnalogSystem
[docs]class CircuitAnalogFrontend(SubCircuitElement):
analog_frontend: AnalogFrontend
xp: List[Terminal]
xn: List[Terminal]
def __init__(
self,
analog_frontend: AnalogFrontend,
vdd_voltage: float = 1.2,
in_high=0.0,
in_low=0.0,
subckt_name: str = "analog_frontend",
instance_name: str = "Xaf",
):
self.analog_frontend = analog_frontend
self.xp = [Terminal(f"X{i}_P") for i in range(analog_frontend.analog_system.N)]
self.xn = [Terminal(f"X{i}_N") for i in range(analog_frontend.analog_system.N)]
super().__init__(
terminals=[
Terminal("VSS"),
Terminal("VDD"),
Terminal("CLK"),
Terminal("VCM"),
]
+ [Terminal(f"IN{i}_P") for i in range(analog_frontend.analog_system.L)]
+ [Terminal(f"IN{i}_N") for i in range(analog_frontend.analog_system.L)]
+ [Terminal(f"OUT{i}_P") for i in range(analog_frontend.analog_system.M)]
+ [Terminal(f"OUT{i}_N") for i in range(analog_frontend.analog_system.M)],
subckt_name=subckt_name,
instance_name=instance_name,
)
self._generate_digital_control(
analog_frontend.analog_system,
analog_frontend.digital_control,
in_high,
in_low,
vdd_voltage,
0.0,
)
def _generate_digital_control(
self,
analog_system: AnalogSystem,
digital_control: Union[NominalDigitalControl, NominalDitherControl],
in_high: float,
in_low: float,
out_high: float,
out_low: float,
):
if isinstance(digital_control, NominalDitherControl):
self.Xdc = DitherControl(
"dc",
analog_system,
digital_control,
in_high,
in_low,
out_high,
out_low,
)
else:
if digital_control._mulit_phase:
self.Xdc = MultiPhaseDigitalControl(
"dc",
analog_system,
digital_control,
in_high,
in_low,
out_high,
out_low,
)
else:
self.Xdc = DigitalControl(
"dc",
analog_system,
digital_control,
in_high,
in_low,
out_high,
out_low,
)
self.connects(
(self["VSS"], self.Xdc["VSS"]),
(self["VDD"], self.Xdc["VDD"]),
(self["CLK"], self.Xdc["CLK"]),
(self["VCM"], self.Xdc["VCM"]),
)
# Connect States
for n in range(analog_system.N):
self.connects(
(self.xp[n], self.Xdc[f"X{n}_P"]),
(self.xn[n], self.Xdc[f"X{n}_N"]),
)
# Connect inputs
for l in range(analog_system.L):
self.connects(
(self[f"IN{l}_P"], self.Xdc[f"IN{l}_P"]),
(self[f"IN{l}_N"], self.Xdc[f"IN{l}_N"]),
)
# Connect outputs (control signals)
for m in range(analog_system.M):
self.connects(
(self[f"OUT{m}_P"], self.Xdc[f"S{m}_P"]),
(self[f"OUT{m}_N"], self.Xdc[f"S{m}_N"]),
)