Source code for cbadc.circuit.models.summer

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


[docs]class SummerModel(DeviceModel): ng_spice_model_name = 'summer' def __init__( self, model_name: str, input_offset: List[float], input_gain: List[float], output_offset: float, output_gain: float, comments: List[str] = ['integrator'], ): if len(input_gain) != len(input_offset): raise ValueError('input_gain and input_offset must be the same size') super().__init__( model_name, comments=comments, input_offset=input_offset, input_gain=input_gain, output_offset=output_offset, output_gain=output_gain, ) # indicate that this model has a verilog-ams implementation self.verilog_ams = True def get_ngspice(self): return _template_env.get_template('ngspice/model.cir.j2').render( { 'model_instance_name': self.model_name, 'model_name': self.ng_spice_model_name, 'parameters': { 'in_offset': self.parameters['input_offset'], 'in_gain': self.parameters['input_gain'], 'out_offset': self.parameters['output_offset'], 'out_gain': self.parameters['output_gain'], }, } ) def get_verilog_ams(self): return _template_env.get_template('verilog_ams/summer.vams.j2').render( { 'module_instance_name': self.model_name, 'inputs': [ { 'active': float(gain) != 0.0, 'magnitude': abs(float(gain)), 'sign': ['+', '-'][float(gain) < 0], 'offset': { 'active': float(offset) != 0.0, 'magnitude': abs(float(offset)), 'sign': ['+', '-'][float(offset) < 0], }, 'name': f'in_{index}', } for index, (gain, offset) in enumerate( zip( self.parameters['input_gain'], self.parameters['input_offset'], ) ) ], 'out_gain': self.parameters['output_gain'], 'out_offset': self.parameters['output_offset'], 'description': 'A weighted summer model', 'terminals': [ f'in_{index}' for index in range(len(self.parameters['input_gain'])) ] + ['out', 'vgnd'], } )