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$object:\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$object:\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$object:\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 for object $object:\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:\tobject $object (",&ALF_ObjectInfoText($object),") is a copy of ALF object $original:\t",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n"); print("# ALF Data Info:\tALF and Liberty views exist for object $original:\t",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n") if $ALF_Hidden{$original}; } else { print("# ALF Data Warning:\tno Liberty view exists for object $object:\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 for object $object:\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:\tobject $object (",&ALF_ObjectInfoText($object,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),") is a copy of object $original:\t",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n"); print("# ALF Data Info:\tLiberty and ALF views exist for object $original:\t",&ALF_ObjectInfoText($original,'ALF_LibertyType','ALF_LibertyName','ALF_LibertyValue'),"\n") if $ALF_Hidden{$original}; } else { print("# ALF Data Warning:\tno ALF view exists for object $object:\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"; }