( ESNUG 255 Item 3 ) -------------------------------------------- [11/14/96]
Subject: (ESNUG 253 #11 254 #4) Can't Reset "max_capacitance" Post-layout!
>> While receiving a post-layout netlist we usually get some/many design rule
>> violations depending on the design and the quality of the libraries.
>> Usually max_capacitance violations can be ignored if they're less than
>> 150% and you do not want to change the netlist more than necessary. It
>> seems Design Compiler is not capable of handling this problem since it
>> will try to remove *all* violations. It is not possible to increase the
>> max_capacitance value?!! (Does anyone not want this? Why?) ... We
>> managed by manipulating (subtracting) capacitance from the data in the
>> annotation-file. However, this is not our preferred design methodology!
>I've recently been through this and I succesfully used the following
>command to change the max capacitance constraint on library cells:
>
> set_attribute LIBRARY_NAME/CELL_NAME/OUTPUT_PIN_NAME max_capacitance X
>
>If you got fancy and used this in a script with the get_attribute command,
>you could automate changing all library cells. Also, you could ask your
>ASIC vendor to provide a library with all the max capacitance attributes
>at 150%, or modify it yourself if you have the source code.
From: "jeffery scott" <jeffs@nortel.ca>
John,
Our vendor likes to use max cap values which are 80% of the value used
in their DRC tools. This isn't too bad for 1st/2nd pass synthesis, but
it is a nightmare during postlayout IPO (Synopsys is out fixing
"nonproblems" during IPO ). My fix was to use the above methodology
to effectively multiply the current max_capacitance value by 1.25. I
wrote a script which goes to every pin in every cell in your library
and prints out the hierarchical pin name and the current capacitance
value to a file. (DC_SHELL couldn't multiply the value itself because
the value was a string not a floating point). I then used perl
to multiply the numbers and add the other syntax of the command.
Here is the dc_shell script (just fill in YOUR_LIB_NAME):
library = YOUR_LIB_NAME
cells_in_lib = library + "/" + "*"
cells = find( cell, cells_in_lib)
foreach ( cellname, cells ) {
pins_in_cell = cellname + "/" + "*"
pins = find( pin, pins_in_cell)
list pins
foreach ( pinname, pins ) {
fullname = cellname + "/" + pinname
list fullname
get_attribute fullname max_capacitance
if(dc_shell_status) {
max_cap = get_attribute(fullname,max_capacitance)
echo fullname >> cap.list
echo max_cap >> cap.list
}
}
}
This creates a file called cap.list
You can use perl to multiply the number and format the file into a
dc_shell script to be read back into synopsys. Run this command
if you have perl on your system (you can change the 1.25 multipy
to any floating point multiply.)
cat cap.list | perl -ne 'chop;$foo = $_;$_=<>; \
s/{//;s/}//;chop;$foo2 = 1.25*$_; \
print "set_attribute $foo max_capacitance $foo2\n";' \
> new_max_cap.dc
This new file "new_max_cap.dc" has the updated max_capacitance values
for all outputs in a library and can be read into synopsys before IPO
to update the values in the current db.
I know that this is a kluge but it worked for me in about 2 minutes.
Note: These settings are not saved to the library only in the db
file that you are working on!!! Don't get tricked!!
- Jeffery B. Scott
Nortel, Morrisville, NC
|
|