### ECSM syntax declarations ### # all ecsm Liberty syntax extensions are superfluous in ALF, so we just hide them @ALF_ecsm_define_groups = ( 'ecsm_waveform', 'ecsm_waveform_set', 'ecsm_lut_template', 'ecsm_capacitance', ); sub ALF_ecsmDefine2ALF { local($library) = @_; foreach $object (&ALF_FindMatchingLibertyObjects($library,'define_group')) { local ($attribute_name) = &Array($ALF_LibertyValue{$object}); $ALF_Hidden{$object} = 'ALF' if &StringMatch($attribute_name,@ALF_ecsm_define_groups); } foreach $object (&ALF_FindMatchingLibertyObjects($library,'define')) { local ($attribute_name,$group_type) = &Array($ALF_LibertyValue{$object}); $ALF_Hidden{$object} = 'ALF' if &StringMatch($group_type,@ALF_ecsm_define_groups); } } ### ECSM models ### sub ALF_ecsmData2ALF { local($library) = @_; foreach $cell (&ALF_FindMatchingObjects($library,'CELL')) { foreach $vector (&ALF_FindMatchingObjects($cell,'VECTOR')) { foreach $slewrate (&ALF_FindMatchingObjects($vector,'SLEWRATE')) { if (&StringMatch($ALF_LibertyType{$slewrate},'rise_transition','fall_transition')) { foreach $object (&Array($ALF_Children{$slewrate})) { local $type = $ALF_LibertyType{$object}; &ALF_ecsmWaveform2ALF($object) if &StringMatch($type,'ecsm_waveform'); &ALF_ecsmWaveformSet2ALF($object) if &StringMatch($type,'ecsm_waveform_set'); &ALF_ecsmCapacitance2ALF($object) if &StringMatch($type,'ecsm_capacitance'); } } } } } } ### ECSM waveform ### sub ALF_ecsmWaveform2ALF { local($ecsm_waveform) = @_; #print("ALF_ecsmWaveform2ALF\t$ecsm_waveform\t",&ALF_ObjectInfoText($ecsm_waveform,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n"); local $index = &Unquote($ALF_LibertyName{$ecsm_waveform}); local $slewrate = $ALF_Parent{$ecsm_waveform}; local $vector = $ALF_Parent{$slewrate}; local $template = &ALF_FindMatchingObject($vector,'TEMPLATE','ecsm_waveform') || &ALF_ecsmWaveformTemplate($slewrate); local $instance = &ALF_FindMatchingObject($vector,'ecsm_waveform') || &ALF_CreateObject($vector,'ecsm_waveform',0,'dynamic'); local $time = &ALF_FindMatchingObject($template,'TIME'); local $table = &ALF_FindMatchingObject($time,'TABLE'); if (&ALF_LexicalMatch('unsigned_integer',$index) && $index < &ArraySize($ALF_Value{$table})) { &ALF_RedefineObject($ecsm_waveform,$instance,'ecsm_values_'.$index,0); local $index_1 = &ALF_FindMatchingLibertyObject($ecsm_waveform,'index_1'); $ALF_Hidden{$index_1} = 'ALF'; local $values = &ALF_FindMatchingLibertyObject($ecsm_waveform,'values'); $ALF_Hidden{$values} = 'ALF'; local $header = &ALF_CreateObject($ecsm_waveform,'HEADER'); local $ecsm_index_1 = &ALF_CreateObject($header,'ecsm_index_1'); &ALF_CreateObject($ecsm_index_1,'TABLE',undef,&Liberty_Array2ALF($ALF_LibertyValue{$index_1})); &ALF_CreateObject($ecsm_waveform,'TABLE',undef,&Liberty_Array2ALF($ALF_LibertyValue{$values})); } } sub ALF_ecsmWaveformTemplate { local($slewrate) = @_; local $template = &ALF_CreateObject($ALF_Parent{$slewrate},'TEMPLATE','ecsm_waveform'); local $time = &ALF_CreateObject($template,'TIME'); local $to = &ALF_CreateObject($time,'TO'); local $threshold = &ALF_CreateObject($to,'THRESHOLD',0,''); local $header = &ALF_FindMatchingObject($slewrate,'HEADER'); &AppendArray($ALF_Children{$time},$header); local @values; for $i (0..&ArraySize($ALF_Value{&ALF_FindMatchingObject($slewrate,'TABLE')})-1) { $values[$i] = ''; } local $table = &ALF_CreateObject($time,'TABLE',0,&CreateArray(@values)); &ALF_DefineTableFormat($table); $template; } ### ECSM waveform set ### sub ALF_ecsmWaveformSet2ALF { local($ecsm_waveform_set) = @_; local $slewrate = $ALF_Parent{$ecsm_waveform_set}; local $vector = $ALF_Parent{$slewrate}; local $template = &ALF_FindMatchingObject($vector,'TEMPLATE','ecsm_waveform_set') || &ALF_ecsmWaveformSetTemplate($slewrate); local $instance = &ALF_FindMatchingObject($vector,'ecsm_waveform_set') || &ALF_CreateObject($vector,'ecsm_waveform_set',0,'dynamic'); local $header = &ALF_CreateObject($ecsm_waveform_set,'HEADER'); local $ecsm_index_1 = &ALF_CreateObject($header,'ecsm_index_1'); local $ecsm_lut_template = &ALF_FindMatchingLibertyObject(&ALF_FindAncestor($vector,'LIBRARY'),'ecsm_lut_template',$ALF_LibertyName{$ecsm_waveform_set}); local $index_1 = &ALF_FindMatchingLibertyObject($ecsm_waveform_set,'index_1') || &ALF_FindMatchingLibertyObject($ecsm_lut_template,'index_1'); $ALF_Hidden{$index_1} = 'ALF'; &ALF_CreateObject($ecsm_index_1,'TABLE',undef,&Liberty_Array2ALF($ALF_LibertyValue{$index_1})); local $i = 0; local $transition = $ALF_LibertyType{$slewrate}; foreach $arg (&Array($ALF_Children{&ALF_FindMatchingObject($slewrate,'HEADER')})) { $i += 1; local $argtable = &ALF_FindMatchingObject($arg,'TABLE'); local $model = &ALF_CreateObject($header,'ecsm_'.$transition.'_index_'.$i); local $table = &ALF_CreateObject($model,'TABLE',undef,$ALF_Value{$argtable}); } local $values = &ALF_FindMatchingLibertyObject($ecsm_waveform_set,'values'); $ALF_Hidden{$values} = 'ALF'; local $table = &ALF_CreateObject($ecsm_waveform_set,'TABLE',undef,&Liberty_Array2ALF($ALF_LibertyValue{$values})); &ALF_DefineTableFormat($table); &ALF_RedefineObject($ecsm_waveform_set,$instance,'ecsm_values',0); } sub ALF_ecsmWaveformSetTemplate { local($slewrate) = @_; local $template = &ALF_CreateObject($ALF_Parent{$slewrate},'TEMPLATE','ecsm_waveform_set'); local $time = &ALF_CreateObject($template,'TIME'); local $to = &ALF_CreateObject($time,'TO'); local $threshold = &ALF_CreateObject($to,'THRESHOLD',0,''); local $header = &ALF_CopyObject(&ALF_FindMatchingObject($slewrate,'HEADER'),$time); local $i = 0; local $transition = $ALF_LibertyType{$slewrate}; foreach $arg (&Array($ALF_Children{$header})) { $i += 1; local $argtable = &ALF_FindMatchingObject($arg,'TABLE'); $ALF_Value{$argtable} = &CreateArray(''); } local $table = &ALF_CreateObject($time,'TABLE',0,&CreateArray('')); &ALF_DefineTableFormat($table); $template; } ### ECSM capacitance ### sub ALF_ecsmCapacitance2ALF { local($ecsm_capacitance) = @_; local $slewrate = $ALF_Parent{$ecsm_capacitance}; local $delay = &ALF_FindMatchingObject($ALF_Parent{$slewrate},'DELAY'); local $from = &ALF_FindMatchingObject($delay,'FROM'); local $pin = &ALF_FindMatchingObject($from,'PIN'); &ALF_CreateObject($ecsm_capacitance,'PIN',undef,$ALF_Value{$pin}); local $header = &ALF_FindMatchingObject($slewrate,'HEADER'); &AppendArray($ALF_Children{$ecsm_capacitance},$header); local $values = &ALF_FindMatchingLibertyObject($ecsm_capacitance,'values'); $ALF_Hidden{$values} = 'ALF'; local $table = &ALF_CreateObject($ecsm_capacitance,'TABLE',undef,&Liberty_Array2ALF($ALF_LibertyValue{$values})); &ALF_DefineTableFormat($table); &ALF_RedefineObject($ecsm_capacitance,$vector,'CAPACITANCE','ecsm_capacitance'); }