head 1.26;
access;
symbols;
locks; strict;
comment @# @;
1.26
date 99.07.28.14.49.45; author ryu; state Exp;
branches;
next 1.25;
1.25
date 99.01.20.07.44.59; author ryu; state Exp;
branches;
next 1.24;
1.24
date 99.01.14.10.19.02; author ryu; state Exp;
branches;
next 1.23;
1.23
date 99.01.13.07.18.42; author ryu; state Exp;
branches;
next 1.22;
1.22
date 98.09.13.14.11.44; author ryu; state Exp;
branches;
next 1.21;
1.21
date 98.09.13.11.09.15; author ryu; state Exp;
branches;
next 1.20;
1.20
date 98.09.13.04.40.51; author ryu; state Exp;
branches;
next 1.19;
1.19
date 98.09.13.03.48.42; author ryu; state Exp;
branches;
next 1.18;
1.18
date 98.09.12.19.54.02; author ryu; state Exp;
branches;
next 1.17;
1.17
date 98.09.08.13.16.49; author ryu; state Exp;
branches;
next 1.16;
1.16
date 98.09.07.19.24.37; author ryu; state Exp;
branches;
next 1.15;
1.15
date 98.09.07.11.48.29; author ryu; state Exp;
branches;
next 1.14;
1.14
date 98.09.06.20.43.23; author ryu; state Exp;
branches;
next 1.13;
1.13
date 98.08.30.20.33.36; author ryu; state Exp;
branches;
next 1.12;
1.12
date 98.08.30.19.24.00; author ryu; state Exp;
branches;
next 1.11;
1.11
date 98.08.29.20.29.13; author ryu; state Exp;
branches;
next 1.10;
1.10
date 98.08.29.17.23.56; author ryu; state Exp;
branches;
next 1.9;
1.9
date 98.08.28.09.58.27; author ryu; state Exp;
branches;
next 1.8;
1.8
date 98.08.26.09.35.38; author ryu; state Exp;
branches;
next 1.7;
1.7
date 98.08.24.06.16.21; author ryu; state Exp;
branches;
next 1.6;
1.6
date 98.08.24.00.48.34; author ryu; state Exp;
branches;
next 1.5;
1.5
date 98.08.23.22.11.24; author ryu; state Exp;
branches;
next 1.4;
1.4
date 98.08.23.21.59.07; author ryu; state Exp;
branches;
next 1.3;
1.3
date 98.08.23.21.16.02; author ryu; state Exp;
branches;
next 1.2;
1.2
date 98.08.23.12.22.09; author ryu; state Exp;
branches;
next 1.1;
1.1
date 98.08.23.12.03.33; author ryu; state Exp;
branches;
next ;
desc
@dump_celldata
@
1.26
log
@Added "section" support
@
text
@# $Id: model.pl,v 1.25 1999/01/20 07:44:59 ryu Exp ryu $
# Copyright (C) 1999 Robert K. Yu
# email: robert@@yu.org
# This file is part of Autochar.
# Autochar is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# Autochar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with Autochar; see the file COPYING. If not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
sub print_model {
my($format, $modelname) = @@_;
open(MODEL, "> $modelname") || die "ERROR: Cannot create file '$modelname'.\n";
if ($format eq 'synopsys') {
&print_synopsys(MODEL);
} elsif ($format eq 'pearl') {
&print_pearl(MODEL);
} else {
die "ERROR: unknown model format type '$format'.\n";
}
close(MODEL);
printf STDERR "Created '$modelname'.\n";
}
sub print_synopsys_cellprops {
my($fp) = @@_;
my ($key, $cell, $type, $propname);
foreach $key (keys(%celldata)) {
($cell, $type, $propname) = split(':', $key);
if (($cell eq $cellname) && ($type eq 'cellprop')) {
# treat 'section' properties differently
if ($propname eq 'section') {
printf $fp "\t%s\n",
$celldata{"$cellname:cellprop:$propname"};
} else {
printf $fp "\t%s : %s ;\n",
$propname, $celldata{"$cellname:cellprop:$propname"};
}
}
}
}
sub print_synopsys_termprops {
my($fp, $refterm) = @@_;
my ($key, $cell, $type, $termname, $propname);
foreach $key (keys(%celldata)) {
($cell, $type, $termname, $propname) = split(':', $key);
if (($cell eq $cellname) && ($type eq 'termprop') && ($termname eq $refterm)) {
printf $fp "\t %s : %s ;\n",
$propname, $celldata{"$cellname:termprop:$termname:$propname"};
}
}
}
sub print_synopsys {
my ($fp) = @@_;
my ($term);
my ($termname, $termtype);
printf $fp "/*\n";
&print_header($fp, ' *');
printf $fp " */\n\n";
printf $fp " cell( \"$cellname\" ) {\n";
&print_synopsys_cellprops($fp);
# print terms
foreach $term (@@termlist) {
($termname, $termtype) = split(':', $term);
printf $fp "\tpin( \"$termname\" ) {\n";
&print_synopsys_termprops($fp, $termname);
if ($termtype eq 'i') {
printf $fp "\t direction : input ;\n";
printf $fp "\t capacitance : %.4e ;\n",
$celldata{"$cellname:input_cap:$termname"}
if $celldata{"$cellname:input_cap:$termname"};
&print_synopsys_input_timing($fp, $termname);
printf $fp "\t}\n";
next;
}
if ($termtype eq 'o') {
printf $fp "\t direction : output ;\n";
&print_synopsys_output_timing($fp, $termname);
printf $fp "\t}\n";
next;
}
}
printf $fp " }\n";
}
sub print_synopsys_input_timing {
my($fp, $input) = @@_;
my ($term);
my ($clock, $termtype);
my ($i, @@wcvalue);
foreach $term (@@termlist) {
($clock, $termtype) = split(':', $term);
if ($termtype eq 'i') {
# D SETUP
if ($celldata{"$cellname:setup_hold:$input:$clock:setup"}) {
printf $fp "\t timing () {\n";
printf $fp "\t\trelated_pin : \"$clock\" ;\n";
if ($celldata{"$cellname:setup_hold:$input:$clock:clktype"} eq 'rising') {
printf $fp "\t\ttiming_type : setup_rising ;\n";
} elsif ($celldata{"$cellname:setup_hold:$input:$clock:clktype"} eq 'falling') {
printf $fp "\t\ttiming_type : setup_falling ;\n";
} else {
printf STDERR "WARNING: unknown clock type '$clktype'.\n";
}
if ($#slewrate == -1) {
# only one value
printf $fp "\t\tintrinsic_rise : %.4e ;\n",
$celldata{"$cellname:setup_hold:$input:$clock:setup_lh[0]"}
if $celldata{"$cellname:setup_hold:$input:$clock:setup_lh[0]"};
printf $fp "\t\tintrinsic_fall : %.4e ;\n",
$celldata{"$cellname:setup_hold:$input:$clock:setup_hl"}[0]
if $celldata{"$cellname:setup_hold:$input:$clock:setup_hl"}[0];
printf $fp "\t }\n";
} else {
# all values
printf $fp "\t\trise_constraint (%s) {\n",
$celldata{"$cellname:setup_hold:$input:$clock:lu_table"};
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#slewrate; $i++) {
printf $fp "%.4e", $celldata{"$cellname:setup_hold:$input:$clock:setup_lh"}[$i];
printf $fp ", " unless ($i == $#slewrate);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t\tfall_constraint (%s) {\n",
$celldata{"$cellname:setup_hold:$input:$clock:lu_table"};
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#slewrate; $i++) {
printf $fp "%.4e", $celldata{"$cellname:setup_hold:$input:$clock:setup_hl"}[$i];
printf $fp ", " unless ($i == $#slewrate);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t }\n";
}
}
# D HOLD
if ($celldata{"$cellname:setup_hold:$input:$clock:hold"}) {
printf $fp "\t timing () {\n";
printf $fp "\t\trelated_pin : \"$clock\" ;\n";
if ($celldata{"$cellname:setup_hold:$input:$clock:clktype"} eq 'rising') {
printf $fp "\t\ttiming_type : hold_rising ;\n";
} elsif ($celldata{"$cellname:setup_hold:$input:$clock:clktype"} eq 'falling') {
printf $fp "\t\ttiming_type : hold_falling ;\n";
} else {
printf STDERR "WARNING: unknown clock type '$clktype'.\n";
}
if ($#slewrate == -1) {
# only one value
printf $fp "\t\tintrinsic_rise : %.4e ;\n",
$celldata{"$cellname:setup_hold:$input:$clock:hold_lh[0]"}
if $celldata{"$cellname:setup_hold:$input:$clock:hold_lh[0]"};
printf $fp "\t\tintrinsic_fall : %.4e ;\n",
$celldata{"$cellname:setup_hold:$input:$clock:hold_hl[0]"}
if $celldata{"$cellname:setup_hold:$input:$clock:hold_hl[0]"};
printf $fp "\t }\n";
} else {
# all values
printf $fp "\t\trise_constraint (%s) {\n",
$celldata{"$cellname:setup_hold:$input:$clock:lu_table"};
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#slewrate; $i++) {
printf $fp "%.4e", $celldata{"$cellname:setup_hold:$input:$clock:hold_lh"}[$i];
printf $fp ", " unless ($i == $#slewrate);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t\tfall_constraint (%s) {\n",
$celldata{"$cellname:setup_hold:$input:$clock:lu_table"};
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#slewrate; $i++) {
printf $fp "%.4e", $celldata{"$cellname:setup_hold:$input:$clock:hold_hl"}[$i];
printf $fp ", " unless ($i == $#slewrate);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t }\n";
}
}
# CE SETUP
if ($celldata{"$cellname:clock_enable:$input:$clock:setup"}) {
printf $fp "\t timing () {\n";
printf $fp "\t\trelated_pin : \"$clock\" ;\n";
if ($celldata{"$cellname:clock_enable:$input:$clock:clktype"} eq 'rising') {
printf $fp "\t\ttiming_type : setup_rising ;\n";
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:clktype"} eq 'falling') {
printf $fp "\t\ttiming_type : setup_falling ;\n";
} else {
printf STDERR "WARNING: unknown clock type '$clktype'.\n";
}
if ($#slewrate == -1) {
# only one value
if ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_high') {
printf $fp "\t\tintrinsic_rise : ";
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_low') {
printf $fp "\t\tintrinsic_fall : ";
} else {
printf STDERR "WARNING: unknown ce type '$cetype'.\n";
}
printf $fp "%.4e ;\n",
&max($celldata{"$cellname:clock_enable:$input:$clock:setup_lh[0]"},
$celldata{"$cellname:clock_enable:$input:$clock:setup_hl[0]"});
printf $fp "\t }\n";
} else {
# all values
@@wcvalue = &bigger_avg_list(
$celldata{"$cellname:clock_enable:$input:$clock:setup_lh"},
$celldata{"$cellname:clock_enable:$input:$clock:setup_hl"});
if ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_high') {
printf $fp "\t\trise_constraint (%s) {\n",
$celldata{"$cellname:clock_enable:$input:$clock:lu_table"};
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_low') {
printf $fp "\t\tfall_constraint (%s) {\n",
$celldata{"$cellname:clock_enable:$input:$clock:lu_table"};
} else {
printf STDERR "WARNING: unknown ce type '$cetype'.\n";
}
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#slewrate; $i++) {
printf $fp "%.4e", $wcvalue[$i];
printf $fp ", " unless ($i == $#slewrate);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t }\n";
}
}
# CE HOLD
if ($celldata{"$cellname:clock_enable:$input:$clock:hold"}) {
printf $fp "\t timing () {\n";
printf $fp "\t\trelated_pin : \"$clock\" ;\n";
if ($celldata{"$cellname:clock_enable:$input:$clock:clktype"} eq 'rising') {
printf $fp "\t\ttiming_type : hold_rising ;\n";
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:clktype"} eq 'falling') {
printf $fp "\t\ttiming_type : hold_falling ;\n";
} else {
printf STDERR "WARNING: unknown clock type '$clktype'.\n";
}
if ($#slewrate == -1) {
# only one value
if ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_high') {
printf $fp "\t\tintrinsic_rise : ";
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_low') {
printf $fp "\t\tintrinsic_fall : ";
} else {
printf STDERR "WARNING: unknown ce type '$cetype'.\n";
}
printf $fp "%.4e ;\n",
&max($celldata{"$cellname:clock_enable:$input:$clock:hold_lh"},
$celldata{"$cellname:clock_enable:$input:$clock:hold_hl"});
printf $fp "\t }\n";
} else {
# all values
@@wcvalue = &bigger_avg_list(
$celldata{"$cellname:clock_enable:$input:$clock:hold_lh"},
$celldata{"$cellname:clock_enable:$input:$clock:hold_hl"});
if ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_high') {
printf $fp "\t\trise_constraint (%s) {\n",
$celldata{"$cellname:clock_enable:$input:$clock:lu_table"};
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_low') {
printf $fp "\t\tfall_constraint (%s) {\n",
$celldata{"$cellname:clock_enable:$input:$clock:lu_table"};
} else {
printf STDERR "WARNING: unknown ce type '$cetype'.\n";
}
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#slewrate; $i++) {
printf $fp "%.4e", $wcvalue[$i];
printf $fp ", " unless ($i == $#slewrate);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t }\n";
}
}
}
}
}
sub print_synopsys_output_timing {
my ($fp, $output) = @@_;
my ($term);
my ($input, $termtype);
my ($i, $j, $k);
foreach $term (@@termlist) {
($input, $termtype) = split(':', $term);
if ($termtype eq 'i') {
# LOAD DELAY
if ($celldata{"$cellname:load_delay:$input:$output"}) {
printf $fp "\t timing () {\n";
printf $fp "\t\trelated_pin : \"$input\" ;\n";
if ($#slewrate == -1) {
# linear model
printf $fp "\t\tintrinsic_rise : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tplha"}
if $celldata{"$cellname:load_delay:$input:$output:tplha"};
printf $fp "\t\tintrinsic_fall : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tphla"}
if $celldata{"$cellname:load_delay:$input:$output:tphla"};
printf $fp "\t\trise_resistance : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tplhb"}
if $celldata{"$cellname:load_delay:$input:$output:tplhb"};
printf $fp "\t\tfall_resistance : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tphlb"}
if $celldata{"$cellname:load_delay:$input:$output:tphlb"};
} else {
# nonlinear model
printf $fp "\t\ttiming_type : combinational ;\n";
if ($celldata{"$cellname:load_delay:$input:$output:tplh"}) {
printf $fp "\t\trise_propagation (%s) {",
$celldata{"$cellname:load_delay:$input:$output:lu_table"};
if ($output_prop_percent == 0.50) {
printf $fp "\n\t\t /* Actual measurement values:";
}
printf $fp "\n\t\t values ( \\";
$k = 0;
for ($j = 0; $j <= $#slewrate; $j++) {
printf $fp "\n\t\t\t\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e",
$celldata{"$cellname:load_delay:$input:$output:tplh"}[$k++];
printf $fp " " unless ($i == $#cload);
}
printf $fp "\"";
printf $fp "," unless ($j == $#slewrate);
printf $fp " \\";
}
printf $fp "\n\t\t )";
if ($output_prop_percent == 0.50) {
printf $fp "\n\t\t */";
printf $fp "\n\t\t /* Propagation minus rise transition delay: */";
printf $fp "\n\t\t values ( \\";
$k = 0;
for ($j = 0; $j <= $#slewrate; $j++) {
printf $fp "\n\t\t\t\"";
for ($i = 0; $i <= $#cload; $i++) {
# subtract the risetime from tplh
printf $fp "%.4e",
($celldata{"$cellname:load_delay:$input:$output:tplh"}[$k] -
$celldata{"$cellname:load_delay:$input:$output:risetime"}[$k]);
$k++;
printf $fp " " unless ($i == $#cload);
}
printf $fp "\"";
printf $fp "," unless ($j == $#slewrate);
printf $fp " \\";
}
printf $fp "\n\t\t )";
}
printf $fp "\n\t\t}\n";
}
if ($celldata{"$cellname:load_delay:$input:$output:tphl"}) {
printf $fp "\t\tfall_propagation (%s) {",
$celldata{"$cellname:load_delay:$input:$output:lu_table"};
if ($output_prop_percent == 0.50) {
printf $fp "\n\t\t /* Actual measurement values:";
}
printf $fp "\n\t\t values ( \\";
$k = 0;
for ($j = 0; $j <= $#slewrate; $j++) {
printf $fp "\n\t\t\t\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e",
$celldata{"$cellname:load_delay:$input:$output:tphl"}[$k++];
printf $fp " " unless ($i == $#cload);
}
printf $fp "\"";
printf $fp "," unless ($j == $#slewrate);
printf $fp " \\";
}
printf $fp "\n\t\t )";
if ($output_prop_percent == 0.50) {
printf $fp "\n\t\t */";
printf $fp "\n\t\t /* Propagation minus fall transition delay: */";
printf $fp "\n\t\t values ( \\";
$k = 0;
for ($j = 0; $j <= $#slewrate; $j++) {
printf $fp "\n\t\t\t\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e",
($celldata{"$cellname:load_delay:$input:$output:tphl"}[$k] -
$celldata{"$cellname:load_delay:$input:$output:falltime"}[$k]);
$k++;
printf $fp " " unless ($i == $#cload);
}
printf $fp "\"";
printf $fp "," unless ($j == $#slewrate);
printf $fp " \\";
}
printf $fp "\n\t\t )";
}
printf $fp "\n\t\t}\n";
}
if ($celldata{"$cellname:load_delay:$input:$output:risetime"}) {
printf $fp "\t\trise_transition (%s) {\n",
$celldata{"$cellname:load_delay:$input:$output:lu_table"};
printf $fp "\t\t values ( \\";
$k = 0;
for ($j = 0; $j <= $#slewrate; $j++) {
printf $fp "\n\t\t\t\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e",
$celldata{"$cellname:load_delay:$input:$output:risetime"}[$k++];
printf $fp " " unless ($i == $#cload);
}
printf $fp "\"";
printf $fp "," unless ($j == $#slewrate);
printf $fp " \\";
}
printf $fp "\n\t\t )";
printf $fp "\n\t\t}\n";
}
if ($celldata{"$cellname:load_delay:$input:$output:falltime"}) {
printf $fp "\t\tfall_transition (%s) {\n",
$celldata{"$cellname:load_delay:$input:$output:lu_table"};
printf $fp "\t\t values ( \\";
$k = 0;
for ($j = 0; $j <= $#slewrate; $j++) {
printf $fp "\n\t\t\t\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e",
$celldata{"$cellname:load_delay:$input:$output:falltime"}[$k++];
printf $fp " " unless ($i == $#cload);
}
printf $fp "\"";
printf $fp "," unless ($j == $#slewrate);
printf $fp " \\";
}
printf $fp "\n\t\t )";
printf $fp "\n\t\t}\n";
}
}
printf $fp "\t }\n";
}
# CLOCK Q
if ($celldata{"$cellname:clock_q:$input:$output"}) {
printf $fp "\t timing () {\n";
printf $fp "\t\trelated_pin : \"$input\" ;\n";
if ($celldata{"$cellname:clock_q:$input:$output:clktype"} eq 'rising') {
printf $fp "\t\ttiming_type : rising_edge ;\n";
} elsif ($celldata{"$cellname:clock_q:$input:$output:clktype"} eq 'falling') {
printf $fp "\t\ttiming_type : falling_edge ;\n";
} else {
printf STDERR "WARNING: unknown clock type '$clktype'.\n";
}
if ($timing_model eq 'linear') {
printf $fp "\t\tintrinsic_rise : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_lha"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_lha"};
printf $fp "\t\tintrinsic_fall : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_hla"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_hla"};
printf $fp "\t\trise_resistance : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_lhb"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_lhb"};
printf $fp "\t\tfall_resistance : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_hlb"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_hlb"};
printf $fp "\t }\n";
} elsif ($timing_model eq 'non_linear') {
printf $fp "\t\trise_propagation (%s) {\n",
$celldata{"$cellname:clock_q:$input:$output:lu_table"};
if ($output_prop_percent == 0.50) {
printf $fp "\t\t /* Actual measurement values:\n";
}
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e", $celldata{"$cellname:clock_q:$input:$output:clk_q_lh"}[$i];
printf $fp ", " unless ($i == $#cload);
}
printf $fp "\")\n";
if ($output_prop_percent == 0.50) {
printf $fp "\t\t */\n";
printf $fp "\t\t /* Propagation minus rise transition delay: */\n";
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e",
($celldata{"$cellname:clock_q:$input:$output:clk_q_lh"}[$i] -
$celldata{"$cellname:clock_q:$input:$output:risetime"}[$i]);
printf $fp ", " unless ($i == $#cload);
}
printf $fp "\")\n";
}
printf $fp "\t\t}\n";
printf $fp "\t\trise_transition (%s) {\n",
$celldata{"$cellname:clock_q:$input:$output:lu_table"};
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e", $celldata{"$cellname:clock_q:$input:$output:risetime"}[$i];
printf $fp ", " unless ($i == $#cload);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t\tfall_propagation (%s) {\n",
$celldata{"$cellname:clock_q:$input:$output:lu_table"};
if ($output_prop_percent == 0.50) {
printf $fp "\t\t /* Actual measurement values:\n";
}
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e", $celldata{"$cellname:clock_q:$input:$output:clk_q_hl"}[$i];
printf $fp ", " unless ($i == $#cload);
}
printf $fp "\")\n";
if ($output_prop_percent == 0.50) {
printf $fp "\t\t */\n";
printf $fp "\t\t /* Propagation minus rise transition delay: */\n";
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e",
($celldata{"$cellname:clock_q:$input:$output:clk_q_hl"}[$i] -
$celldata{"$cellname:clock_q:$input:$output:falltime"}[$i]);
printf $fp ", " unless ($i == $#cload);
}
printf $fp "\")\n";
}
printf $fp "\t\t}\n";
printf $fp "\t\tfall_transition (%s) {\n",
$celldata{"$cellname:clock_q:$input:$output:lu_table"};
printf $fp "\t\t values (\"";
for ($i = 0; $i <= $#cload; $i++) {
printf $fp "%.4e", $celldata{"$cellname:clock_q:$input:$output:falltime"}[$i];
printf $fp ", " unless ($i == $#cload);
}
printf $fp "\")\n\t\t}\n";
printf $fp "\t }\n";
} else {
printf STDERR "WARNING: unknown timing model type '$timing_model'.\n";
}
}
}
}
}
1;
@
1.25
log
@No perl header
@
text
@d1 1
a1 1
# $Id: model.pl,v 1.24 1999/01/14 10:19:02 ryu Exp ryu $
d47 8
a54 2
printf $fp "\t%s : %s ;\n",
$propname, $celldata{"$cellname:cellprop:$propname"};
@
1.24
log
@Using /usr/bin/perl
@
text
@d1 1
a1 3
#! /usr/bin/perl
# $Id: model.pl,v 1.23 1999/01/13 07:18:42 ryu Exp ryu $
@
1.23
log
@GPL
@
text
@d1 1
a1 1
#! /usr/local/bin/perl
d3 1
a3 1
# $Id$
@
1.22
log
@typo
@
text
@d3 1
a3 5
# Copyright (c) 1998-2001, Robert K. Yu. All Rights Reserved.
#
# No part of this program may be used, reproduced, stored in a
# retrieval system, or transmitted in any form or by any
# means without the prior permission of the author.
d5 2
a6 3
# $Id: model.pl,v 1.21 1998/09/13 11:09:15 ryu Exp ryu $
# Write different models.
# Author: Robert K. Yu
d8 16
@
1.21
log
@wip
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.20 1998/09/13 04:40:51 ryu Exp ryu $
d133 2
a134 1
printf $fp "\t\trise_constraint ($lu_table_name) {\n";
d142 2
a143 1
printf $fp "\t\tfall_constraint ($lu_table_name) {\n";
d178 2
a179 1
printf $fp "\t\trise_constraint ($lu_table_name) {\n";
d187 2
a188 1
printf $fp "\t\tfall_constraint ($lu_table_name) {\n";
d232 2
a233 1
printf $fp "\t\trise_constraint ($lu_table_name) {\n";
d235 2
a236 1
printf $fp "\t\tfall_constraint ($lu_table_name) {\n";
d284 2
a285 1
printf $fp "\t\trise_constraint ($lu_table_name) {\n";
d287 2
a288 1
printf $fp "\t\tfall_constraint ($lu_table_name) {\n";
d344 2
a345 1
printf $fp "\t\trise_propagation ($lu_table_name) {";
d393 2
a394 1
printf $fp "\t\tfall_propagation ($lu_table_name) {";
d441 2
a442 1
printf $fp "\t\trise_transition ($lu_table_name) {\n";
d462 2
a463 1
printf $fp "\t\tfall_transition ($lu_table_name) {\n";
d517 2
a518 1
printf $fp "\t\trise_propagation ($lu_table_name) {\n";
d542 2
a543 1
printf $fp "\t\trise_transition ($lu_table_name) {\n";
d551 2
a552 1
printf $fp "\t\tfall_propagation ($lu_table_name) {\n";
d576 2
a577 1
printf $fp "\t\tfall_transition ($lu_table_name) {\n";
@
1.20
log
@Added slew rate dependence on clock enable
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.19 1998/09/13 03:48:42 ryu Exp ryu $
d148 1
d191 1
d241 1
d291 1
d568 1
@
1.19
log
@wip
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.18 1998/09/12 19:54:02 ryu Exp ryu $
d103 1
a103 1
my ($i);
d125 2
a126 2
$celldata{"$cellname:setup_hold:$input:$clock:setup_lh"}
if $celldata{"$cellname:setup_hold:$input:$clock:setup_lh"};
d167 2
a168 2
$celldata{"$cellname:setup_hold:$input:$clock:hold_lh"}
if $celldata{"$cellname:setup_hold:$input:$clock:hold_lh"};
d170 2
a171 2
$celldata{"$cellname:setup_hold:$input:$clock:hold_hl"}
if $celldata{"$cellname:setup_hold:$input:$clock:hold_hl"};
d206 34
a239 11
if ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_high') {
printf $fp "\t\tintrinsic_rise : ";
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_low') {
printf $fp "\t\tintrinsic_fall : ";
} else {
printf STDERR "WARNING: unknown ce type '$cetype'.\n";
}
printf $fp "%.4e ;\n",
&max($celldata{"$cellname:clock_enable:$input:$clock:setup_lh"},
$celldata{"$cellname:clock_enable:$input:$clock:setup_hl"});
printf $fp "\t }\n";
d255 34
a288 11
if ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_high') {
printf $fp "\t\tintrinsic_rise : ";
} elsif ($celldata{"$cellname:clock_enable:$input:$clock:cetype"} eq 'active_low') {
printf $fp "\t\tintrinsic_fall : ";
} else {
printf STDERR "WARNING: unknown ce type '$cetype'.\n";
}
printf $fp "%.4e ;\n",
&max($celldata{"$cellname:clock_enable:$input:$clock:hold_lh"},
$celldata{"$cellname:clock_enable:$input:$clock:hold_hl"});
printf $fp "\t }\n";
a289 1
@
1.18
log
@Added slew-rate to setup and hold; support for non-linear models for clock-q
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.17 1998/09/08 13:16:49 ryu Exp ryu $
d439 1
d453 1
d457 3
d465 14
a478 1
printf $fp "\")\n\t\t}\n";
d489 3
d497 14
a510 1
printf $fp "\")\n\t\t}\n";
@
1.17
log
@slew rate at the clock input of setup_hold (wip)
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.16 1998/09/07 19:24:37 ryu Exp ryu $
d103 1
d109 1
d122 27
a148 7
printf $fp "\t\tintrinsic_rise : %.4e ;\n",
$celldata{"$cellname:setup_hold:$input:$clock:setup_lh"}
if $celldata{"$cellname:setup_hold:$input:$clock:setup_lh"};
printf $fp "\t\tintrinsic_fall : %.4e ;\n",
$celldata{"$cellname:setup_hold:$input:$clock:setup_hl"}
if $celldata{"$cellname:setup_hold:$input:$clock:setup_hl"};
printf $fp "\t }\n";
d150 2
d164 6
a169 4
printf $fp "\t\tintrinsic_rise : %.4e ;\n",
$celldata{"$cellname:setup_hold:$input:$clock:hold_lh"}
if $celldata{"$cellname:setup_hold:$input:$clock:hold_lh"};
printf $fp "\t\tintrinsic_fall : %.4e ;\n",
d171 20
a190 2
if $celldata{"$cellname:setup_hold:$input:$clock:hold_hl"};
printf $fp "\t }\n";
d193 1
d218 2
d259 2
d287 1
a287 1
printf $fp "\t\trise_propagation ($init{'corner'}) {";
d289 1
a289 1
if ($trans{'output_prop_percent'} == 0.50) {
d308 1
a308 1
if ($trans{'output_prop_percent'} == 0.50) {
d335 1
a335 1
printf $fp "\t\tfall_propagation ($init{'corner'}) {";
d337 1
a337 1
if ($trans{'output_prop_percent'} == 0.50) {
d356 1
a356 1
if ($trans{'output_prop_percent'} == 0.50) {
d382 1
a382 1
printf $fp "\t\trise_transition ($init{'corner'}) {\n";
d402 1
a402 1
printf $fp "\t\tfall_transition ($init{'corner'}) {\n";
d425 1
d438 51
a488 13
printf $fp "\t\tintrinsic_rise : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_lha"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_lha"};
printf $fp "\t\tintrinsic_fall : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_hla"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_hla"};
printf $fp "\t\trise_resistance : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_lhb"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_lhb"};
printf $fp "\t\tfall_resistance : %.4e ;\n",
$celldata{"$cellname:clock_q:$input:$output:clk_q_hlb"}
if $celldata{"$cellname:clock_q:$input:$output:clk_q_hlb"};
printf $fp "\t }\n";
@
1.16
log
@Subtract transition from propagation delay if the prop delay
is already measured at 50% output.
@
text
@d3 1
a3 1
# Copyright (c) 1998, Robert K. Yu. All Rights Reserved.
d9 1
a9 1
# $Id: model.pl,v 1.15 1998/09/07 11:48:29 ryu Exp $
@
1.15
log
@Subtract the transition delay from the prop delay if the output prop
delay measurement is not made at the 50% point.
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.14 1998/09/06 20:43:23 ryu Exp ryu $
d238 1
a238 2
printf $fp "\t\trise_propagation ($init{'corner'}) {\n";
printf $fp "\t\t values ( \\";
d241 1
a241 1
printf $fp "\n\t\t\t/* Actual measurement values:";
d244 1
d257 1
d260 1
a260 1
printf $fp "\n\t\t\t*/";
d262 2
a263 1
printf $fp "\n\t\t\t/* Prop minus transition delay: */\n";
d279 1
a281 1
printf $fp "\n\t\t )\n";
d286 1
a286 2
printf $fp "\t\tfall_propagation ($init{'corner'}) {\n";
printf $fp "\t\t values ( \\";
d289 1
a289 1
printf $fp "\n\t\t\t/* Actual measurement values:";
d292 1
d305 1
d308 1
a308 1
printf $fp "\n\t\t\t*/";
d310 2
a311 1
printf $fp "\n\t\t\t/* Prop minus transition delay: */\n";
d326 1
a328 1
printf $fp "\n\t\t )\n";
d348 1
a348 1
printf $fp "\n\t\t )\n";
d368 1
a368 1
printf $fp "\n\t\t )\n";
@
1.14
log
@clock enable
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.13 1998/08/30 20:33:36 ryu Exp ryu $
d241 4
d257 22
d282 1
d287 4
d303 21
d327 1
d347 1
@
1.13
log
@Added timing_type to nonlinear load_delay outptu section
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.12 1998/08/30 19:24:00 ryu Exp ryu $
d107 1
d148 50
d204 1
a204 1
my ($fp, $output) = @@_;
@
1.12
log
@Using term instead of port; extract all cell and terminal properties into synopsys model.
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.11 1998/08/29 20:29:13 ryu Exp ryu $
a164 1
d184 2
@
1.11
log
@Added nonlinear rise/fall propagation/transition
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.10 1998/08/29 17:23:56 ryu Exp ryu $
d31 27
d60 2
a61 2
my ($port);
my ($portname, $porttype);
d69 10
a78 8
printf $fp "\tarea : %s ;\n",
$celldata{"$cellname:area"}
if $celldata{"$cellname:area"};
foreach $port (@@portlist) {
($portname, $porttype) = split(':', $port);
if ($porttype eq 'i') {
printf $fp "\tpin( \"$portname\" ) {\n";
d81 3
a83 3
$celldata{"$cellname:input_cap:$portname"}
if $celldata{"$cellname:input_cap:$portname"};
&print_synopsys_input_timing($fp, $portname);
d87 1
a87 2
if ($porttype eq 'o') {
printf $fp "\tpin( \"$portname\" ) {\n";
d89 1
a89 4
printf $fp "\t function : \"%s\" ;\n",
$celldata{"$cellname:function:$portname"}
if $celldata{"$cellname:function:$portname"};
&print_synopsys_output_timing($fp, $portname);
d101 2
a102 2
my ($port);
my ($clock, $porttype);
d104 3
a106 3
foreach $port (@@portlist) {
($clock, $porttype) = split(':', $port);
if ($porttype eq 'i') {
d154 2
a155 2
my ($port);
my ($input, $porttype);
d158 3
a160 3
foreach $port (@@portlist) {
($input, $porttype) = split(':', $port);
if ($porttype eq 'i') {
@
1.10
log
@add more control of prop delay measurement
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.9 1998/08/28 09:58:27 ryu Exp ryu $
d143 1
d159 1
d161 1
a161 1
printf $fp "\t\trise_transition ($init{'corner'}) {\n";
d180 38
d226 1
a226 1
$celldata{"$cellname:load_delay:$input:$output:tphl"}[$k++];
@
1.9
log
@$#slewrate is -1 when the list is empty.
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.8 1998/08/26 09:35:38 ryu Exp ryu $
d15 1
a15 1
my($format) = @@_;
d17 1
a17 3
if ($debug) {
&dump_celldata();
}
d20 1
a20 1
&print_synopsys();
d22 1
a22 4
&print_pearl();
} elsif ($format eq 'none') {
# do nothing
return;
d26 2
a27 8
}
sub dump_celldata {
my ($key);
foreach $key (sort keys(%celldata)) {
printf STDERR "$key = $celldata{$key}\n";
}
d32 1
d36 3
a38 1
printf MODEL "cell( \"$cellname\" ) {\n";
d40 3
a42 1
printf MODEL " area : %s ;\n",
d49 3
a51 3
printf MODEL " pin( \"$portname\" ) {\n";
printf MODEL "\tdirection : input ;\n";
printf MODEL "\tcapacitance : %.4e ;\n",
d54 2
a55 2
&print_synopsys_input_timing($portname);
printf MODEL " }\n";
d59 3
a61 3
printf MODEL " pin( \"$portname\" ) {\n";
printf MODEL "\tdirection : output ;\n";
printf MODEL "\tfunction : \"%s\" ;\n",
d64 2
a65 2
&print_synopsys_output_timing($portname);
printf MODEL " }\n";
d70 1
a70 4
printf MODEL "}\n";
close (MODEL);
printf STDERR "Created '$modelout'.\n";
d75 1
a75 1
my($input) = @@_;
d83 2
a84 2
printf MODEL "\ttiming () {\n";
printf MODEL "\t related_pin : \"$clock\" ;\n";
d87 1
a87 1
printf MODEL "\t timing_type : setup_rising ;\n";
d89 1
a89 1
printf MODEL "\t timing_type : setup_falling ;\n";
d94 1
a94 1
printf MODEL "\t intrinsic_rise : %.4e ;\n",
d97 1
a97 1
printf MODEL "\t intrinsic_fall : %.4e ;\n",
d100 1
a100 1
printf MODEL "\t}\n";
d103 2
a104 2
printf MODEL "\ttiming () {\n";
printf MODEL "\t related_pin : \"$clock\" ;\n";
d107 1
a107 1
printf MODEL "\t timing_type : hold_rising ;\n";
d109 1
a109 1
printf MODEL "\t timing_type : hold_falling ;\n";
d114 1
a114 1
printf MODEL "\t intrinsic_rise : %.4e ;\n",
d117 1
a117 1
printf MODEL "\t intrinsic_fall : %.4e ;\n",
d120 1
a120 1
printf MODEL "\t}\n";
d128 1
a128 1
my ($output) = @@_;
d138 2
a139 2
printf MODEL "\ttiming () {\n";
printf MODEL "\t related_pin : \"$input\" ;\n";
d143 1
a143 1
printf MODEL "\t intrinsic_rise : %.4e ;\n",
d146 1
a146 1
printf MODEL "\t intrinsic_fall : %.4e ;\n",
d149 1
a149 1
printf MODEL "\t rise_resistance : %.4e ;\n",
d152 1
a152 1
printf MODEL "\t fall_resistance : %.4e ;\n",
d159 2
a160 2
printf MODEL "\t rise_transition ($init{'corner'}) {\n";
printf MODEL "\t\tvalues ( \\";
d164 1
a164 1
printf MODEL "\n\t\t \"";
d166 1
a166 1
printf MODEL "%.4e",
d168 1
a168 1
printf MODEL " " unless ($i == $#cload);
d170 3
a172 3
printf MODEL "\"";
printf MODEL "," unless ($j == $#slewrate);
printf MODEL " \\";
d174 2
a175 1
printf MODEL "\n\t\t);\n";
d178 2
a179 2
printf MODEL "\t fall_transition ($init{'corner'}) {\n";
printf MODEL "\t\tvalues ( \\";
d183 1
a183 1
printf MODEL "\n\t\t \"";
d185 1
a185 1
printf MODEL "%.4e",
d187 1
a187 1
printf MODEL " " unless ($i == $#cload);
d189 3
a191 3
printf MODEL "\"";
printf MODEL "," unless ($j == $#slewrate);
printf MODEL " \\";
d193 2
a194 1
printf MODEL "\n\t\t);\n";
d198 1
a198 1
printf MODEL "\t}\n";
d202 2
a203 2
printf MODEL "\ttiming () {\n";
printf MODEL "\t related_pin : \"$input\" ;\n";
d206 1
a206 1
printf MODEL "\t timing_type : rising_edge ;\n";
d208 1
a208 1
printf MODEL "\t timing_type : falling_edge ;\n";
d213 1
a213 1
printf MODEL "\t intrinsic_rise : %.4e ;\n",
d216 1
a216 1
printf MODEL "\t intrinsic_fall : %.4e ;\n",
d219 1
a219 1
printf MODEL "\t rise_resistance : %.4e ;\n",
d222 1
a222 1
printf MODEL "\t fall_resistance : %.4e ;\n",
d225 1
a225 1
printf MODEL "\t}\n";
a228 222
}
#-------------------------------------------------------------------------------
sub ic_save_data {
my($cellname, $in, $cscaled) = @@_;
$celldata{"$cellname:input_cap:$in"} = $cscaled;
}
#
# cq_save_data --
#
sub cq_save_data {
local($cellname, $clk, $q, $clktype,
*creal, *clk_q_lh, $clk_q_hl, *risetime, *falltime) = @@_;
my($risetimea, $risetimeb, $risetimer2);
my($falltimea, $falltimeb, $falltimer2);
my($clk_q_lha, $clk_q_lhb, $clk_q_lhr2);
my($clk_q_hla, $clk_q_hlb, $clk_q_hlr2);
if ($#clk_q_lh == $#creal) {
($clk_q_lha, $clk_q_lhb, $clk_q_lhr2) = &svlinreg('lin', \@@creal, \@@clk_q_lh);
}
if ($#clk_q_hl == $#creal) {
($clk_q_hla, $clk_q_hlb, $clk_q_hlr2) = &svlinreg('lin', \@@creal, \@@clk_q_hl);
}
if ($#risetime == $#creal) {
($risetimea, $risetimeb, $risetimer2) = &svlinreg('lin', \@@creal, \@@risetime);
}
if ($#falltime == $#creal) {
($falltimea, $falltimeb, $falltimer2) = &svlinreg('lin', \@@creal, \@@falltime);
}
$celldata{"$cellname:clock_q:$clk:$q"} = 1;
$celldata{"$cellname:clock_q:$clk:$q:clktype"} = $clktype;
$celldata{"$cellname:clock_q:$clk:$q:clk_q_lha"} = $clk_q_lha;
$celldata{"$cellname:clock_q:$clk:$q:clk_q_lhb"} = $clk_q_lhb;
$celldata{"$cellname:clock_q:$clk:$q:clk_q_hla"} = $clk_q_hla;
$celldata{"$cellname:clock_q:$clk:$q:clk_q_hlb"} = $clk_q_hlb;
$celldata{"$cellname:clock_q:$clk:$q:risetimea"} = $risetimea;
$celldata{"$cellname:clock_q:$clk:$q:risetimeb"} = $risetimeb;
$celldata{"$cellname:clock_q:$clk:$q:falltimea"} = $falltimea;
$celldata{"$cellname:clock_q:$clk:$q:falltimeb"} = $falltimeb;
}
#
# ld_save_data --
#
sub ld_save_data {
local ($cellname, $in, $out, *creal,
*tplh, *tphl, *risetime, *falltime, *inputrise, *inputfall) = @@_;
my($risetimea, $risetimeb, $risetimer2);
my($falltimea, $falltimeb, $falltimer2);
my($tplha, $tplhb, $tplhr2);
my($tphla, $tphlb, $tphlr2);
$celldata{"$cellname:load_delay:$in:$out"} = 1;
if ($#slewrate == -1) {
# do single value linear regression
if ($#tplh == $#creal) {
($tplha, $tplhb, $tplhr2) = &svlinreg('lin', \@@creal, \@@tplh);
}
if ($#tphl == $#creal) {
($tphla, $tphlb, $tphlr2) = &svlinreg('lin', \@@creal, \@@tphl);
}
if ($#risetime == $#creal) {
($risetimea, $risetimeb, $risetimer2) = &svlinreg('lin', \@@creal, \@@risetime);
}
if ($#falltime == $#creal) {
($falltimea, $falltimeb, $falltimer2) = &svlinreg('lin', \@@creal, \@@falltime);
}
$celldata{"$cellname:load_delay:$in:$out:tplha"} = $tplha;
$celldata{"$cellname:load_delay:$in:$out:tplhb"} = $tplhb;
$celldata{"$cellname:load_delay:$in:$out:tphla"} = $tphla;
$celldata{"$cellname:load_delay:$in:$out:tphlb"} = $tphlb;
$celldata{"$cellname:load_delay:$in:$out:risetimea"} = $risetimea;
$celldata{"$cellname:load_delay:$in:$out:risetimeb"} = $risetimeb;
$celldata{"$cellname:load_delay:$in:$out:falltimea"} = $falltimea;
$celldata{"$cellname:load_delay:$in:$out:falltimeb"} = $falltimeb;
} else {
# just save it for now; do least square error later (?)
$celldata{"$cellname:load_delay:$in:$out:tplh"} = [ @@tplh ];
$celldata{"$cellname:load_delay:$in:$out:tphl"} = [ @@tphl ];
$celldata{"$cellname:load_delay:$in:$out:risetime"} = [ @@risetime ];
$celldata{"$cellname:load_delay:$in:$out:falltime"} = [ @@falltime ];
$celldata{"$cellname:load_delay:$in:$out:inputrise"} = [ @@inputrise ];
$celldata{"$cellname:load_delay:$in:$out:inputfall"} = [ @@inputfall ];
}
}
sub s_save_data {
my ($cellname, $d, $clk, $clktype, $trans, $value) = @@_;
$celldata{"$cellname:setup_hold:$d:$clk:setup"} = 1;
$celldata{"$cellname:setup_hold:$d:$clk:clktype"} = $clktype;
$celldata{"$cellname:setup_hold:$d:$clk:$trans"} = $value;
}
sub h_save_data {
my ($cellname, $d, $clk, $clktype, $trans, $value) = @@_;
$celldata{"$cellname:setup_hold:$d:$clk:hold"} = 1;
$celldata{"$cellname:setup_hold:$d:$clk:clktype"} = $clktype;
$celldata{"$cellname:setup_hold:$d:$clk:$trans"} = $value;
}
#-------------------------------------------------------------------------------
sub ld_copy_data {
my($cellname, $in, $out, $refin, $refout) = @@_;
if ($celldata{"$cellname:load_delay:$refin:$refout"}) {
$celldata{"$cellname:load_delay:$in:$out"} = 1;
if ($#slewrate == -1) {
$celldata{"$cellname:load_delay:$in:$out:tplha"} =
$celldata{"$cellname:load_delay:$refin:$refout:tplha"};
$celldata{"$cellname:load_delay:$in:$out:tplhb"} =
$celldata{"$cellname:load_delay:$refin:$refout:tplhb"};
$celldata{"$cellname:load_delay:$in:$out:tphla"} =
$celldata{"$cellname:load_delay:$refin:$refout:tphla"};
$celldata{"$cellname:load_delay:$in:$out:tphlb"} =
$celldata{"$cellname:load_delay:$refin:$refout:tphlb"};
$celldata{"$cellname:load_delay:$in:$out:risetimea"} =
$celldata{"$cellname:load_delay:$refin:$refout:risetimea"};
$celldata{"$cellname:load_delay:$in:$out:risetimeb"} =
$celldata{"$cellname:load_delay:$refin:$refout:risetimeb"};
$celldata{"$cellname:load_delay:$in:$out:falltimea"} =
$celldata{"$cellname:load_delay:$refin:$refout:falltimea"};
$celldata{"$cellname:load_delay:$in:$out:falltimeb"} =
$celldata{"$cellname:load_delay:$refin:$refout:falltimeb"};
} else {
$celldata{"$cellname:load_delay:$refin:$refout:tplh"} =
[ @@celldata{"$cellname:load_delay:$in:$out:tplh"} ];
$celldata{"$cellname:load_delay:$refin:$refout:tphl"} =
[ @@celldata{"$cellname:load_delay:$in:$out:tphl"} ];
$celldata{"$cellname:load_delay:$refin:$refout:risetime"} =
[ @@celldata{"$cellname:load_delay:$in:$out:risetime"} ];
$celldata{"$cellname:load_delay:$refin:$refout:falltime"} =
[ @@celldata{"$cellname:load_delay:$in:$out:falltime"} ];
$celldata{"$cellname:load_delay:$refin:$refout:inputrise"} =
[ @@celldata{"$cellname:load_delay:$in:$out:inputrise"} ];
$celldata{"$cellname:load_delay:$refin:$refout:inputfall"} =
[ @@celldata{"$cellname:load_delay:$in:$out:inputfall"} ];
}
} else {
printf STDERR "WARNING: No load_delay data associated with \"$refin\" to \"$refout\".\n";
}
}
sub ic_copy_data {
my($cellname, $in, $refin) = @@_;
$celldata{"$cellname:input_cap:$in"} =
$celldata{"$cellname:input_cap:$refin"};
}
sub cq_copy_data {
local($cellname, $clktype, $clk, $q, $refclk, $refq) = @@_;
if ($celldata{"$cellname:clock_q:$refclk:$refq"}) {
$celldata{"$cellname:clock_q:$clk:$q"} = 1;
$celldata{"$cellname:clock_q:$clk:$q:clktype"} = $clktype;
$celldata{"$cellname:clock_q:$clk:$q:clk_q_lha"} =
$celldata{"$cellname:clock_q:$refclk:$refq:clk_q_lha"};
$celldata{"$cellname:clock_q:$clk:$q:clk_q_lhb"} =
$celldata{"$cellname:clock_q:$refclk:$refq:clk_q_lhb"};
$celldata{"$cellname:clock_q:$clk:$q:clk_q_hla"} =
$celldata{"$cellname:clock_q:$refclk:$refq:clk_q_hla"};
$celldata{"$cellname:clock_q:$clk:$q:clk_q_hlb"} =
$celldata{"$cellname:clock_q:$refclk:$refq:clk_q_hlb"};
$celldata{"$cellname:clock_q:$clk:$q:risetimea"} =
$celldata{"$cellname:clock_q:$refclk:$refq:risetimea"};
$celldata{"$cellname:clock_q:$clk:$q:risetimea"} =
$celldata{"$cellname:clock_q:$refclk:$refq:risetimea"};
$celldata{"$cellname:clock_q:$clk:$q:risetimeb"} =
$celldata{"$cellname:clock_q:$refclk:$refq:risetimeb"};
$celldata{"$cellname:clock_q:$clk:$q:falltimea"} =
$celldata{"$cellname:clock_q:$refclk:$refq:falltimea"};
$celldata{"$cellname:clock_q:$clk:$q:falltimeb"} =
$celldata{"$cellname:clock_q:$refclk:$refq:falltimeb"};
} else {
printf STDERR "WARNING: No clock-Q data associated with \"$refclk\" to \"$refq\".\n";
}
}
sub sh_copy_data {
my ($cellname, $d, $clktype, $clk, $refd, $refclk) = @@_;
$celldata{"$cellname:setup_hold:$d:$clk:setup"} = 1;
$celldata{"$cellname:setup_hold:$d:$clk:clktype"} = $clktype;
$celldata{"$cellname:setup_hold:$d:$clk:setup_lh"} =
$celldata{"$cellname:setup_hold:$refd:$refclk:setup_lh"};
$celldata{"$cellname:setup_hold:$d:$clk:setup_hl"} =
$celldata{"$cellname:setup_hold:$refd:$refclk:setup_hl"};
$celldata{"$cellname:setup_hold:$d:$clk:hold"} = 1;
$celldata{"$cellname:setup_hold:$d:$clk:clktype"} = $clktype;
$celldata{"$cellname:setup_hold:$d:$clk:hold_lh"} =
$celldata{"$cellname:setup_hold:$refd:$refclk:hold_lh"};
$celldata{"$cellname:setup_hold:$d:$clk:hold_hl"} =
$celldata{"$cellname:setup_hold:$refd:$refclk:hold_hl"};
@
1.8
log
@added slewrate modelling.
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.7 1998/08/24 06:16:21 ryu Exp $
d150 1
a150 1
if ($#slewrate == 0) {
d301 1
a301 1
if ($#slewrate == 0) {
d366 1
a366 1
if ($#slewrate == 0) {
@
1.7
log
@Added multivariable linear regression
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.6 1998/08/24 00:48:34 ryu Exp ryu $
d137 1
a137 1
my($output) = @@_;
d140 1
d146 1
d149 56
a204 12
printf MODEL "\t intrinsic_rise : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tplha"}
if $celldata{"$cellname:load_delay:$input:$output:tplha"};
printf MODEL "\t intrinsic_fall : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tphla"}
if $celldata{"$cellname:load_delay:$input:$output:tphla"};
printf MODEL "\t rise_resistance : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tplhb"}
if $celldata{"$cellname:load_delay:$input:$output:tplhb"};
printf MODEL "\t fall_resistance : %.4e ;\n",
$celldata{"$cellname:load_delay:$input:$output:tphlb"}
if $celldata{"$cellname:load_delay:$input:$output:tphlb"};
d207 1
d291 2
a292 2
local ($cellname, $in, $out,
*creal, *tplh, *tphl, *risetime, *falltime) = @@_;
d299 37
a335 8
if ($#tplh == $#creal) {
($tplha, $tplhb, $tplhr2) = &svlinreg('lin', \@@creal, \@@tplh);
}
if ($#tphl == $#creal) {
($tphla, $tphlb, $tphlr2) = &svlinreg('lin', \@@creal, \@@tphl);
}
if ($#risetime == $#creal) {
($risetimea, $risetimeb, $risetimer2) = &svlinreg('lin', \@@creal, \@@risetime);
a336 13
if ($#falltime == $#creal) {
($falltimea, $falltimeb, $falltimer2) = &svlinreg('lin', \@@creal, \@@falltime);
}
$celldata{"$cellname:load_delay:$in:$out"} = 1;
$celldata{"$cellname:load_delay:$in:$out:tplha"} = $tplha;
$celldata{"$cellname:load_delay:$in:$out:tplhb"} = $tplhb;
$celldata{"$cellname:load_delay:$in:$out:tphla"} = $tphla;
$celldata{"$cellname:load_delay:$in:$out:tphlb"} = $tphlb;
$celldata{"$cellname:load_delay:$in:$out:risetimea"} = $risetimea;
$celldata{"$cellname:load_delay:$in:$out:risetimeb"} = $risetimeb;
$celldata{"$cellname:load_delay:$in:$out:falltimea"} = $falltimea;
$celldata{"$cellname:load_delay:$in:$out:falltimeb"} = $falltimeb;
d363 1
d365 33
a397 16
$celldata{"$cellname:load_delay:$in:$out:tplha"} =
$celldata{"$cellname:load_delay:$refin:$refout:tplha"};
$celldata{"$cellname:load_delay:$in:$out:tplhb"} =
$celldata{"$cellname:load_delay:$refin:$refout:tplhb"};
$celldata{"$cellname:load_delay:$in:$out:tphla"} =
$celldata{"$cellname:load_delay:$refin:$refout:tphla"};
$celldata{"$cellname:load_delay:$in:$out:tphlb"} =
$celldata{"$cellname:load_delay:$refin:$refout:tphlb"};
$celldata{"$cellname:load_delay:$in:$out:risetimea"} =
$celldata{"$cellname:load_delay:$refin:$refout:risetimea"};
$celldata{"$cellname:load_delay:$in:$out:risetimeb"} =
$celldata{"$cellname:load_delay:$refin:$refout:risetimeb"};
$celldata{"$cellname:load_delay:$in:$out:falltimea"} =
$celldata{"$cellname:load_delay:$refin:$refout:falltimea"};
$celldata{"$cellname:load_delay:$in:$out:falltimeb"} =
$celldata{"$cellname:load_delay:$refin:$refout:falltimeb"};
@
1.6
log
@Added copy_data functions to copy characterization data from one arc to another
to save time.
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.5 1998/08/23 22:11:24 ryu Exp ryu $
d215 1
a215 1
($clk_q_lha, $clk_q_lhb, $clk_q_lhr2) = &linreg('lin', \@@creal, \@@clk_q_lh);
d218 1
a218 1
($clk_q_hla, $clk_q_hlb, $clk_q_hlr2) = &linreg('lin', \@@creal, \@@clk_q_hl);
d221 1
a221 1
($risetimea, $risetimeb, $risetimer2) = &linreg('lin', \@@creal, \@@risetime);
d224 1
a224 1
($falltimea, $falltimeb, $falltimer2) = &linreg('lin', \@@creal, \@@falltime);
d253 1
a253 1
($tplha, $tplhb, $tplhr2) = &linreg('lin', \@@creal, \@@tplh);
d256 1
a256 1
($tphla, $tphlb, $tphlr2) = &linreg('lin', \@@creal, \@@tphl);
d259 1
a259 1
($risetimea, $risetimeb, $risetimer2) = &linreg('lin', \@@creal, \@@risetime);
d262 1
a262 1
($falltimea, $falltimeb, $falltimer2) = &linreg('lin', \@@creal, \@@falltime);
@
1.5
log
@Robert K. Yu
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.4 1998/08/23 21:59:07 ryu Exp ryu $
a33 1
d47 5
a51 1
printf MODEL " area : %s ;\n", $celldata{"$cellname:area"};
d97 1
a97 1
} elsif ($celldata{"$cellname:clock_q:$input:$clock:clktype"} eq 'falling') {
d117 1
a117 1
} elsif ($celldata{"$cellname:clock_q:$input:$clock:clktype"} eq 'falling') {
d192 2
a193 1
#-------------------------------------------------------------------------------------
d292 85
@
1.4
log
@save_data functions moved into model.pl; pass lists by reference
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.3 1998/08/23 21:16:02 ryu Exp ryu $
d11 1
a11 1
# Author: Robert Yu
@
1.3
log
@Write out synopsys lib.
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.2 1998/08/23 12:22:09 ryu Exp ryu $
d188 103
d292 1
@
1.2
log
@print out synopsys model for combinatorial gates.
@
text
@d9 1
a9 1
# $Id: model.pl,v 1.1 1998/08/23 12:03:33 ryu Exp ryu $
d47 1
a47 1
printf MODEL "cell($cellname) {\n";
d52 1
a52 1
printf MODEL " pin($portname) {\n";
d55 3
a57 1
$celldata{"$cellname:input_cap:$portname"};
d62 1
a62 1
printf MODEL " pin($portname) {\n";
d65 3
a67 2
$celldata{"$cellname:function:$portname"};
&print_synopsys_timing($portname);
d79 55
a133 1
sub print_synopsys_timing {
d141 1
a141 1
if ($celldata{"$cellname:load_delay:$input:$output"} == 1) {
d143 1
d145 2
a146 1
$celldata{"$cellname:load_delay:$input:$output:tplha"};
d148 2
a149 1
$celldata{"$cellname:load_delay:$input:$output:tphla"};
d151 2
a152 1
$celldata{"$cellname:load_delay:$input:$output:tplhb"};
d154 6
a159 1
$celldata{"$cellname:load_delay:$input:$output:tphlb"};
d161 21
@
1.1
log
@Initial revision
@
text
@d9 1
a9 1
# $Id: autochar.pl,v 1.13 1998/08/23 10:13:32 ryu Exp ryu $
d14 1
a14 1
sub create_model {
d22 1
a22 1
&create_synopsys();
d24 1
a24 1
&create_pearl();
d43 2
a44 2
sub create_synopsys {
my ($i, $port);
d54 1
a54 1
printf MODEL "\tcapacitance : %.4f ;\n",
d60 6
a65 1
printf MODEL " pin($portname) {\n\tdirection : output ;\n";
d76 24
@