POLYNOMIAL_BASED_EM_DC {
LENGTH_RANGES { 1e38 }
EM_POLYNOMIALS {
{ 0.3802 + (13.4739 * sqrt(W/0.9)) + (4.6272 * (W/0.9)) }
}
}
POLYNOMIAL_BASED_EM_RMS {
LENGTH_RANGES { 1e38 }
EM_POLYNOMIALS {
{ 0.3802 + (13.4739 * sqrt(W/0.9)) + (4.6272 * (W/0.9)) }
}
}
####
POLYNOMIAL_BASED_EM_DC {
COND_RULE { L > 0 AND W > 0}
EM_POLYNOMIAL { 0.3802 + (13.4739 * sqrt(W/0.9)) + (4.6272 * (W/0.9)) IMAX -2.632 + (27.136 * (W/0.9)) }
}
POLYNOMIAL_BASED_EM_RMS {
COND_RULE { L > 0 AND W > 0}
EM_POLYNOMIAL { 0.3802 + (13.4739 * sqrt(W/0.9)) + (4.6272 * (W/0.9)) }
}
####
my $rw = open(FILE, $techfile);
if(not defined($rw)) {
die "ERROR Can't read techfile! \n";
}
while(defined(my $i = )) {
chomp($i);
if( $i =~ /metal/ ) {
$blockMetal=1;
$curlev=&LevelList("metal ",$i);
$metals{$curlev}=();
}
if( $i =~ /via/ ) {
$blockVia=1;
$curlev=&LevelList("via ",$i);
$vias{$curlev}=();
}
#start single metal-level extraction
if($blockMetal > 0) {
$zBlock=&CharCount($zBlock,$i);
if( $i =~ /POLYNOMIAL_BASED_EM_DC/ ) {
$blockEMDC=1;
}
#start extraction
#POLYNOMIAL_BASED_EM_DC block for single metal level
if($blockEMDC > 0) {
$zzBlock=&CharCount($zzBlock,$i);
push @readin, $i; #line added to array
if($zzBlock == 0) {
$blockEMDC=0;
$readin=join(' ',@readin); #connect whole block to one string
$_=&CreateHash($readin,\%{$metals{$curlev}{'POLY_BASED_EM_DC'}},'DC',$eps);
#if(!$_) {print("$curlev DC consistent is fine!\n")};#only for debugging
if($_==1){print("$curlev DC lentgh AND width ranges block is missing!\n")}
elsif($_==2){print("$curlev DC count of lentgh-ranges AND count of EM_POLYNOMIALS blocks doesn't match!\n")}
elsif($_==3){print("$curlev DC count of width-ranges AND count of EM_POLYNOMIALS block-lines doesn't match!\n")}
undef @readin;
undef $readin;
undef $zzBlock;
}
}
#end extraction
#POLYNOMIAL_BASED_EM_DC block for single metal level