Source code for cbadc.circuit.models.comparator

from typing import List
from .. import DeviceModel, _template_env, SPICE_VALUE


[docs]class ADC_Bridge_Model(DeviceModel): ng_spice_model_name = 'adc_bridge' def __init__( self, model_name: str, in_low: SPICE_VALUE, in_high: SPICE_VALUE, rise_delay: SPICE_VALUE = 1e-9, fall_delay: SPICE_VALUE = 1e-9, comments: List[str] = [], ): super().__init__( model_name, comments=comments, in_low=in_low, in_high=in_high, rise_delay=rise_delay, fall_delay=fall_delay, ) def get_ngspice(self) -> str: return _template_env.get_template('ngspice/model.cir.j2').render( { 'model_instance_name': self.model_name, 'model_name': self.ng_spice_model_name, 'parameters': self.parameters, } )
[docs]class DAC_Bridge_Model(DeviceModel): ng_spice_model_name = 'dac_bridge' def __init__( self, model_name: str, out_low: SPICE_VALUE, out_high: SPICE_VALUE, out_undef: SPICE_VALUE, input_load: SPICE_VALUE = 1e-12, t_rise: SPICE_VALUE = 1e-9, t_fall: SPICE_VALUE = 1e-9, comments: List[str] = [], ): super().__init__( model_name, comments=comments, out_low=out_low, out_high=out_high, out_undef=out_undef, input_load=input_load, t_rise=t_rise, t_fall=t_fall, ) def get_ngspice(self) -> str: return _template_env.get_template('ngspice/model.cir.j2').render( { 'model_instance_name': self.model_name, 'model_name': self.ng_spice_model_name, 'parameters': self.parameters, } )
[docs]class D_Flip_Flop_Model(DeviceModel): ng_spice_model_name = 'd_dff' def __init__( self, model_name: str, clk_delay: SPICE_VALUE = 13e-9, set_delay: SPICE_VALUE = 25e-9, reset_delay: SPICE_VALUE = 27e-9, ic: SPICE_VALUE = 0, rise_delay: SPICE_VALUE = 10e-9, fall_delay: SPICE_VALUE = 3e-9, comments: List[str] = [], ): super().__init__( model_name, clk_delay=clk_delay, set_delay=set_delay, reset_delay=reset_delay, ic=ic, rise_delay=rise_delay, fall_delay=fall_delay, comments=comments, ) def get_ngspice(self) -> str: return _template_env.get_template('ngspice/model.cir.j2').render( { 'model_instance_name': self.model_name, 'model_name': self.ng_spice_model_name, 'parameters': self.parameters, } )
[docs]class ClockedComparatorModel(DeviceModel): ng_spice_model_name = 'clocked_comparator' def __init__( self, model_name: str, in_low: SPICE_VALUE, in_high: SPICE_VALUE, out_low: SPICE_VALUE, out_high: SPICE_VALUE, out_undef: SPICE_VALUE, input_load: SPICE_VALUE = 1e-12, clk_delay: SPICE_VALUE = 0.0, clk_offset: SPICE_VALUE = 0.6, t_tolerance: SPICE_VALUE = 0.0, t_rise: SPICE_VALUE = 1e-9, t_fall: SPICE_VALUE = 1e-9, comments: List[str] = [], ) -> None: super().__init__( model_name, in_low=in_low, in_high=in_high, out_low=out_low, out_high=out_high, out_undef=out_undef, input_load=input_load, clk_delay=clk_delay, clk_offset=clk_offset, t_rise=t_rise, t_fall=t_fall, t_tolerance=t_tolerance, comments=comments, ) # indicate that this model has a verilog-ams implementation self.verilog_ams = True self.adc_bridge = ADC_Bridge_Model( 'in_adc_bridge', self.parameters['in_low'], self.parameters['in_high'], rise_delay=t_rise, fall_delay=t_fall, ) self.clk_adc_bridge = ADC_Bridge_Model( 'clk_adc_bridge', self.parameters['clk_offset'], self.parameters['clk_offset'], rise_delay=t_rise, fall_delay=t_fall, ) self.dac_bridge = DAC_Bridge_Model( 'dac_bridge', self.parameters['out_low'], self.parameters['out_high'], self.parameters['out_undef'], input_load=self.parameters['input_load'], t_rise=self.parameters['t_rise'], t_fall=self.parameters['t_fall'], ) self.flip_flop = D_Flip_Flop_Model( 'd_flip_flop', clk_delay=self.parameters['clk_delay'], ) def get_ngspice(self): return '\n'.join( [ self.adc_bridge.get_ngspice(), self.clk_adc_bridge.get_ngspice(), self.dac_bridge.get_ngspice(), self.flip_flop.get_ngspice(), ] ) def get_verilog_ams(self) -> str: return _template_env.get_template( 'verilog_ams/clocked_comparator.vams.j2' ).render( { 'module_instance_name': self.model_name, 'model_name': self.ng_spice_model_name, 'parameters': self.parameters, 'description': 'A ternary clocked comparator', 'terminals': ['clk', 'in', 'out'], } )
[docs]class DifferentialClockedComparatorModel(DeviceModel): ng_spice_model_name = 'clocked_comparator' def __init__( self, model_name: str, in_low: SPICE_VALUE, in_high: SPICE_VALUE, out_low: SPICE_VALUE, out_high: SPICE_VALUE, out_undef: SPICE_VALUE, input_load: SPICE_VALUE = 1e-12, clk_delay: SPICE_VALUE = 0.0, clk_offset: SPICE_VALUE = 0.6, t_tolerance: SPICE_VALUE = 0.0, t_rise: SPICE_VALUE = 1e-9, t_fall: SPICE_VALUE = 1e-9, comments: List[str] = [], ) -> None: super().__init__( model_name, in_low=in_low, in_high=in_high, out_low=out_low, out_high=out_high, out_undef=out_undef, input_load=input_load, clk_delay=clk_delay, clk_offset=clk_offset, t_rise=t_rise, t_fall=t_fall, t_tolerance=t_tolerance, comments=comments, ) # indicate that this model has a verilog-ams implementation self.verilog_ams = True self.adc_bridge = ADC_Bridge_Model( 'in_adc_bridge', self.parameters['in_low'], self.parameters['in_high'], rise_delay=t_rise, fall_delay=t_fall, ) self.clk_adc_bridge = ADC_Bridge_Model( 'clk_adc_bridge', self.parameters['clk_offset'], self.parameters['clk_offset'], rise_delay=t_rise, fall_delay=t_fall, ) self.dac_bridge_p = DAC_Bridge_Model( 'dac_bridge', self.parameters['out_low'], self.parameters['out_high'], self.parameters['out_undef'], input_load=self.parameters['input_load'], t_rise=self.parameters['t_rise'], t_fall=self.parameters['t_fall'], ) # self.dac_bridge_n = DAC_Bridge_Model( # 'n_dac_bridge', # self.parameters['out_low'], # self.parameters['out_high'], # self.parameters['out_undef'], # input_load=self.parameters['input_load'], # t_rise=self.parameters['t_rise'], # t_fall=self.parameters['t_fall'], # ) self.flip_flop = D_Flip_Flop_Model( 'd_flip_flop', clk_delay=self.parameters['clk_delay'], ) def get_ngspice(self): return '\n'.join( [ self.adc_bridge.get_ngspice(), self.clk_adc_bridge.get_ngspice(), self.dac_bridge_p.get_ngspice(), # self.dac_bridge_n.get_ngspice(), self.flip_flop.get_ngspice(), ] ) def get_verilog_ams(self) -> str: raise NotImplementedError return _template_env.get_template( 'verilog_ams/clocked_comparator.vams.j2' ).render( { 'module_instance_name': self.model_name, 'model_name': self.ng_spice_model_name, 'parameters': self.parameters, 'description': 'A ternary clocked comparator', 'terminals': ['clk', 'in', 'out'], } )