1; sub ALF_DumpDatabase { print("# System Message:\tstarted dumping ALF/Liberty database ",&DateTime,"\n"); local (@alfonly,@libonly,@both); foreach $object (keys %ALF_Type) { $alfonly[$#alfonly+1] = $object unless defined($ALF_LibertyType{$object}); $both[$#both+1] = $object if defined($ALF_LibertyType{$object}); } foreach $object (keys %ALF_LibertyType) { $libonly[$#libonly+1] = $object unless defined($ALF_Type{$object}); } print("# Summary:\n"); print("#\tdatabase contains ",&ALF_NumberOfThings($#both+$#libonly+$#alfonly+3,'object')," total\n"); print("#\tdatabase contains ",&ALF_NumberOfThings($#both+1,'object')," with both alf and lib view\n") if ($#both >= 0); print("#\tdatabase contains ",&ALF_NumberOfThings($#libonly+1,'object')," with lib view only\n") if ($#libonly >= 0); print("#\tdatabase contains ",&ALF_NumberOfThings($#alfonly+1,'object')," with alf view only\n") if ($#alfonly >= 0); print("# Objects with both alf and lib view\n") if ($#both >= 0); foreach $object (@both) { print("#\t",&ALF_ObjectInfoText($object,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n"); } print("# Objects with lib view only\n") if ($#libonly >= 0); foreach $object (@libonly) { print("#\t",&ALF_ObjectInfoText($object,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n"); } print("# Objects with alf view only\n") if ($#alfonly >= 0); foreach $object (@alfonly) { print("#\t",&ALF_ObjectInfoText($object),"\n"); } print("# System Message:\tfinished dumping ALF/Liberty database ",&DateTime,"\n"); } sub ALF_ReportLibraryContents { local($root,$xref) = @_; &ALF_ReportLibertyLibraryContents($root,$xref); &ALF_ReportALFLibraryContents($root,$xref); } sub ALF_ReportALFLibraryContents { local($root,$xref) = @_; print("# System Message:\tstarted reporting library contents ",&DateTime,"\n"); local (@xref,@noxref); local @libraries = &ALF_FindMatchingObjects($root,'LIBRARY'); print("# database \47$root\47 contains ",&ALF_NumberOfThings($#libraries+1,'ALF library'),"\n"); foreach $library (@libraries) { if ($ALF_LibertyType{$library}) { $xref[$#xref+1] = $library; } else { $noxref[$#noxref+1] = $library; } local @cells = &ALF_FindMatchingObjects($library,'CELL'); local $libname = $ALF_Name{$library}; print("# ALF library \47$libname\47 contains ",&ALF_NumberOfThings($#cells+1,'ALF cell'),"\n"); foreach $cell (@cells) { if ($ALF_LibertyType{$cell}) { $xref[$#xref+1] = $cell; } else { $noxref[$#noxref+1] = $cell; } local $cellname = $ALF_Name{$cell}; local @inputs = &ALF_FindMatchingObjects($cell,'PIN',1,undef,'DIRECTION','input'); print("#\tALF cell \47$cellname\47 contains ",&ALF_NumberOfThings($#inputs+1,'input pin'),"\n"); local @outputs = &ALF_FindMatchingObjects($cell,'PIN',1,undef,'DIRECTION','output'); print("#\tALF cell \47$cellname\47 contains ",&ALF_NumberOfThings($#outputs+1,'output pin'),"\n"); foreach $pin (@inputs,@outputs) { if ($ALF_LibertyType{$pin}) { $xref[$#xref+1] = $pin; } else { $noxref[$#noxref+1] = $pin; } } foreach $modeltype ('ENERGY','DELAY','SLEWRATE','SETUP','HOLD','RECOVERY','REMOVAL') { local @models; foreach $vector (&ALF_FindMatchingObjects($cell,'VECTOR')) { local $model = &ALF_FindMatchingObject($vector,$modeltype); $models[$#models+1] = $model if defined($model); } print("#\tALF cell \47$cellname\47 contains ",&ALF_NumberOfThings($#models+1,'arithmetic model')," of type $modeltype\n") if ($#models>=0); foreach $model (@models) { if ($ALF_LibertyType{$model}) { $xref[$#xref+1] = $model; } else { $noxref[$#noxref+1] = $model; } } } } } if ($xref) { foreach $object (@xref) { print("# ALF Data Info:\tALF and Liberty views exist:\t",&ALF_ObjectInfoText($object,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n") unless $ALF_Hidden{$object}; } foreach $object (@noxref) { local $original = $ALF_Original{$object}; unless ($ALF_Hidden{$object}) { if ($ALF_LibertyType{$original}) { print("# ALF Data Info:\tcopy (",&ALF_ObjectInfoText($object),") of original (",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),")\n"); print("# ALF Data Info:\tALF and Liberty views exist:\t",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n") if $ALF_Hidden{$original}; } else { print("# ALF Data Warning:\tno Liberty view exists:\t",&ALF_ObjectInfoText($object),"\n"); } } } } print("# System Message:\tfinished reporting library contents ",&DateTime,"\n"); } sub ALF_ReportLibertyLibraryContents { local($root,$xref) = @_; print("# System Message:\tstarted reporting library contents ",&DateTime,"\n"); local (@xref,@noxref); local @libraries = &ALF_FindMatchingLibertyObjects($root,'library'); print("# database \47$root\47 contains ",&ALF_NumberOfThings($#libraries+1,'Liberty library'),"\n"); foreach $library (@libraries) { if ($ALF_Type{$library}) { $xref[$#xref+1] = $library; } else { $noxref[$#noxref+1] = $library; } local @cells = &ALF_FindMatchingLibertyObjects($library,'cell'); local $libname = $ALF_LibertyName{$library}; print("# Liberty library \47$libname\47 contains ",&ALF_NumberOfThings($#cells+1,'Liberty cell'),"\n"); foreach $cell (@cells) { if ($ALF_Type{$cell}) { $xref[$#xref+1] = $cell; } else { $noxref[$#noxref+1] = $cell; } local $cellname = $ALF_LibertyName{$cell}; local @inputs = &ALF_FindMatchingLibertyObjects($cell,'pin',1,undef,'direction','input'); print("#\tLiberty cell \47$cellname\47 contains ",&ALF_NumberOfThings($#inputs+1,'input pin'),"\n"); local @outputs = &ALF_FindMatchingLibertyObjects($cell,'pin',1,undef,'direction','output'); print("#\tLiberty cell \47$cellname\47 contains ",&ALF_NumberOfThings($#outputs+1,'output pin'),"\n"); foreach $pin (@inputs,@outputs) { if ($ALF_Type{$pin}) { $xref[$#xref+1] = $pin; } else { $noxref[$#noxref+1] = $pin; } } foreach $modeltype ('rise_power','fall_power','cell_rise','cell_fall','rise_transition','fall_transition','rise_constraint','fall_constraint') { local @models; foreach $pin (@inputs,@outputs) { foreach $container ( &ALF_FindMatchingLibertyObjects($pin,'timing'), &ALF_FindMatchingLibertyObjects($pin,'internal_power'), ) { local $model = &ALF_FindMatchingLibertyObject($container,$modeltype); $models[$#models+1] = $model if defined($model); } } print("#\tLiberty cell \47$cellname\47 contains ",&ALF_NumberOfThings($#models+1,'arithmetic model')," of type $modeltype\n") if ($#models>=0); foreach $model (@models) { if ($ALF_Type{$model}) { $xref[$#xref+1] = $model; } else { $noxref[$#noxref+1] = $model; } } } } } if ($xref) { foreach $object (@xref) { print("# ALF Data Info:\tLiberty and ALF views exist:\t",&ALF_ObjectInfoText($object,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n") unless $ALF_Hidden{$object}; } foreach $object (@noxref) { local $original = $ALF_Original{$object}; unless ($ALF_Hidden{$object}) { if ($ALF_Type{$original}) { print("# ALF Data Info:\tcopy (",&ALF_ObjectInfoText($object,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),") of original (",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),")\n"); print("# ALF Data Info:\tLiberty and ALF views exist:\t",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n") if $ALF_Hidden{$original}; } else { print("# ALF Data Warning:\tno ALF view exists:\t",&ALF_ObjectInfoText($object,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n"); } } } } print("# System Message:\tfinished reporting library contents ",&DateTime,"\n"); } sub ALF_NumberOfThings { local ($number,$things) = @_; local @things = split(/\s+/,$things); local $last = $things[$#things]; $last = ($number == 1)? &Singular($last) : &Plural($last); $things[$#things] = $last; "$number @things"; } sub ALF_ReportExpressionData { local($cell) = @_; print("# ALF Data Info:\treporting expression data found in cell\t",&ALF_ObjectInfoText($cell),"\n"); local @pins = &ALF_FindMatchingObjects($cell,'PIN'); local $behavior = &ALF_FindMatchingObject(&ALF_FindMatchingObject($cell,'FUNCTION'),'BEHAVIOR'); foreach $vector ( &ALF_FindMatchingObjects($behavior,'@'), &ALF_FindMatchingObjects($behavior,':'), &ALF_FindMatchingObjects($cell,'VECTOR'), ) { local $name = $ALF_Name{$vector}; local $expression = $ALF_Expression{$vector}; print("# Analysis of expression $name\n"); print("#\t$name is single event\n") if &ALF_SingleEvent($expression); print("#\t$name is dual event\n") if &ALF_DualEvent($expression); print("#\t$name is boolean expression\n") if &ALF_BooleanExpression($expression); print(&ALF_ExpressionInfoText($expression,"#"),"\n"); foreach $pin (@pins) { local $pin_name = $ALF_Name{$pin}; local $edge_literal = &ALF_FindEdgeLiteral($expression,$pin_name); print("#\tsingle event: \47$edge_literal $pin_name\47\n") if $edge_literal; } local $boolean_expression = &ALF_FindBooleanExpression($expression); print("#\tboolean expression: \47$boolean_expression\47\n") if $boolean_expression; } }