SPEF to OpenAccess Mapping


This document describes how SPEF parasitic information maps to OpenAccess. OpenAccess includes standard implementations for translating SPEF information to and from an OpenAccess database. This document contains mapping information about the following SPEF constructs:

spef2oa is the translator for creating an OpenAccess database from a SPEF file. For information about using the translator, see SPEF to OpenAccess Translator (spef2oa). oa2spef is the translator for creating a SPEF file from an OpenAccess database. For information about using this translator, see OpenAccess to SPEF Translator (oa2spef).

Overview

According to the SPEF standard, the parasitic values for resistance, capacitance, inductance, and delay can be specified as single float values or as triplet float values (float : float : float). In OpenAccess, parasitic values are associated with analysis points. A single float value is associated with a single analysis point. Three analysis points are required to represent triplet float values. The three analysis points are min, typ, and max.

Both the spef2oa and oa2spef translators include command line options for handling single and triple analysis points. spef2oa adds the parasitic values to an OpenAccess database as follows:

oa2spef extracts parasitic values from an OpenAccess database as follows:

SPEF HEADER Section

A SPEF file includes a HEADER section, which is composed of a number of subsections. The HEADER subsections are:

The information related to the HEADER section and its subsections is not stored in the OpenAccess database. However, spef2oa uses the unit values and the values for *DIVIDER, *DELIMITER, and *BUS_DELIMITER during a translation.

When extracting the parasitic values to a SPEF file, the oa2spef translator uses default values for these constructs, but you can specify other values by using command line options.

Unit Mapping

The SPEF standard specifies time, resistance, capacitance, and inductance units. The units used in OpenAccess are MKS units. For each parameter, the following table lists the base unit, the SPEF unit construct, the oa2spef unit options, and the default oa2spef units if units are not specified on the command line. oa2spef adjusts parasitic values based upon the units specified on the command line.

Parameter Base Unit SPEF Unit Construct oa2spef Options Default Unit
time second *T_UNIT PS for picosecond
NS for nanosecond
PS
resistance Ohm *R_UNIT OHM or
KOHM for kilOhm
OHM
capacitance Farad *C_UNIT PF for picoFarad
FF for femtoFarad
PF
inductance Henry *L_UNIT HENRY
MH for milliHenry
UH for microHenry
HENRY

NAME_MAP

NAME_MAP is an optional SPEF file section. Its purpose is to reduce file size by mapping an index to a name that is frequently used in a SPEF file.

spef2oa implements an index-to-name map table that represents the name map section in a SPEF file. An index and an associated name are entered into the table while reading the entries in the NAME_MAP section. A unique index is assigned to each net (plus its instances and terminals) that has parasitic information. Instead of storing the name of a net, term, or instance, the index associated with the object is stored.

By default, oa2spef does not write a name map unless the –nameMap option is used. When the –nameMap option is used, oa2spef maps all nets that have parasitic data. In addition to the net name, all instance, terminal, and all instance terminal names that are associated with the mapped net are also mapped. Power and ground nets are always mapped when the –nameMap option is used, whether or not they contain parasitic data. However, instances, terminals, and instance terminals connected exclusively to the power and ground nets, are never mapped.

POWER_NETS and GROUND_NETS

The SPEF constructs for power and ground nets are:

	*POWER_NETS net_name  { net_name }
	.
	.
	.
	
	*GROUND_NETS net_name  { net_name }
	.
	.
	.

In OpenAccess, the type of net (whether power or ground) is obtained by using the oaNet::getType() method. The following table maps the SPEF power and ground constructs to their corresponding objects in OpenAccess.

Type of Net in SPEF

oaType

POWER_NET

oacPowerSigType

GROUND_NET

oacGroundSigType

Dependent on the type of net, oa2spef adds it in the *POWER_NETS section or in the *GROUND_NETS section. The index from the name map table is used instead of the net name if an index is stored as an extension to a net.

spef2oa ignores the *POWER_NETS and *GROUND_NETS designations, but it doesn't ignore the parasitic data. Parasitic data is always associated with signal nets.

PORTS

The PORTS section of the SPEF file lists the terminals in a block along with their direction and connection attributes. The construct for the PORTS section is:

	*PORTS port_entry  { port_entry }
	
	port_entry ::= port_name  direction  { conn_attr }

port_name is replaced by the name of the term. If an index to the name exists in the name map table as an extension to the oaTerm object, oa2spef uses the index for the port_name.

The direction of an oaTerm is determined by its oaTermType. The oacInputTermType maps to a SPEF input port represented by the I direction indicator, oacOutputTermType maps to an output port represented by the O direction indicator, and oacInputOutputTermType maps to a SPEF bidirectional port represented by a B direction indicator.

Note: oa2spef does not write the <conn_attr> section for PORTS. However, you can inherit the related class in a custom implementation to include this data.

spef2oa ignores the PORTS section of the SPEF file.

D_NET

The SPEF D_NET section describes the detailed parasitic information for a particular net. The construct for this section is:

	*D_NET net_ref total_cap  [ routing_conf ] [ conn_sec ] [ res_sec ] [ induc_sec ] *END

*D_NET Parameter Mapping

net_ref
The net_ref can be either a net name or an index to a net name in the name map table.
total_cap
This is the total of all capacitances on a net.

oa2spef adds the capacitance values of all oaCouplingCaps in the parasitic network, and the resulting value is adjusted according to the specified C_UNIT. spef2oa ignores this section.
routing_conf
spef2oa sets the routing confidence for a net using the oaNet::setParasiticConfidence() method. oa2spef obtains the routing confidence of a net by using the oaNet::getParasiticConfidence() method.
conn_sec
The construct for this parameter is:
*CONN conn_def  { conn_def } { internal_node_coord } 
	
conn_def ::= [ *P port_name direction { conn_attr } | *I pin_name direction { conn_attr }] 
The *P section lists the terms that are present on a net. spef2oa ignores this section. oa2spef maps the port_name or the index to the term name if the index is stored as an extension on the oaTerm object. The direction is determined according to the oaTermType of oaTerm. Refer to the *PORTS section for mapping between direction and oaTermType.

internal_node_coord ::= *N internal_node_name coordinates

The *N section lists the internal nodes and the coordinates associated with them.

The *I section lists the instTerms that are present on a net. spef2oa ignores this section. oa2spef maps the pin_name to the instance name and term name delimited by the specified pin delimiter. The indices are used instead of instance names and term names if indices are stored as an extension on the oaInst and oaTerm objects. The direction is determined according to oaTermType of oaTerm. Refer to the *PORTS section for the mapping between direction and oaTermType.

The conn_attr section is ignored by both spef2oa and oa2spef.
cap_sec
The construct for this parameter is:
		
*CAP cap_elem  { cap_elem } 

cap_elem ::= [cap_id node_name par_value  | cap_id node_name node_name2 par_value ]
cap_elem maps to the oaCouplingCap object in OpenAccess. cap_id is an id used while creating the oaCouplingCap object.
node_name (or node_name2) ::= [<net_name><pin_delimiter><oaNode id> | 
                              [ oaTerm name | <index>] |
                              [ <instance_name><pin_delimiter><term_name> ]*
                              ]

* Only if a capacitor is connected to an instTerm.

The par_value is the capacitance value for a given analysis point or for the triple analysis points if provided. spef2oa creates the "From" and "To" nodes to represent node_name and node_name2. If node_name2 is absent, oaGroundedNode is created. The oaCouplingCap is created with a given cap_id. The appropriate oaCouplingCap::create() method is used if a capacitor is connected to an instTerm or node in a different parasitic network.

spef2oa obtains the following values from the oaCouplingCap object:

oa2spef suppresses grounded capacitors that have values of 0.0. If there are multiple values on a capacitor (from multiple analysis points), the capacitor is suppressed only if all the values are 0.0.

A node id is obtained from oaNode.
res_sec
The construct for this parameter is:
*RES res_elem  { res_elem } 

res_elem ::= res_id node_name node_name par_value
The res_elem maps to the oaResistor object in OpenAccess, and the res_id maps to the id that is used while creating the oaResistor object. Refer to cap_sec for mapping of the node_name. The par_value is the resistance value for a given analysis point or for multiple points.

spef2oa creates oaNodes to represent "From" and "To" nodes of the oaResistor. The translator uses the oaResistor::create() method to create a resistor element.

The following values are obtained from the oaResistor object:
ind_sec
The construct for this parameter is:
*INDUC induc_elem  { induc_element }

 induc_element ::= induc_id node_name node_name par_value
 

The induc_elem maps to the oaInductor object in OpenAccess, and the induc_id maps to the id that is used to create the oaInductor object. The par_value is the inductance value for a given analysis point or for multiple points.

spef2oa creates oaNodes to represent "From" and "To" nodes of the oaInductor. The translator uses the oaInductor::create() method to create an inductor element.

R_NET

The R_NET section describes the reduced parasitic information for a particular net.

Issues:

The construct for R_NET is:

	*R_NET net_ref total_cap [ routing_conf ] { driver_reduc } *END 

Note: spef2oa ignores the *R_NET section if there is no "driver_reduc" section, and oa2spef does not write reduced parasitic information for a net that does not have a driver.

*R_NET Parameter Mapping

net_ref
The net_ref can be either a net name or an index to a net name in the name map table.
total_cap
total_cap is the sum of all capacitances on a net.

spef20a ignores this section. oa2spef loads the parasitic model of the first driver found on a net. If it is oaPiElmore or oaPiPoleResidue, the near and far capacitance values are added to calculate total_cap. If there is no driver for the net, the R_NET section is not written.
routing_conf
spef2oa sets the routing confidence for a net using the oaNet::setParasiticConfidence() method. oa2spef obtains the routing confidence of a net by using the oaNet::getParasiticConfidence() method.
driver_reduc
The construct for this parameter is:
driver_reduc ::= driver_pair driver_cell pie_model load_desc
This section maps to the following reduced parasitic models that can be stored for each driver of a net.
	
driver_pair ::= *DRIVER pin_name
spef2oa finds the instTerm associated with the given pin_name, and the reduced parasitic models are created using this instTerm.

oa2spef Gets the term name and instance name from the instTerm and writes the indices if they exist for these names. Otherwise, the instance and term names are delimited by the pin delimiter.

	
driver_cell ::= *CELL < cell_name >

spef2oa ignores this section. oa2spef maps cell_name to the name of the instance.

pie_model ::= *C2_R1_C1 par_value par_value par_value
spef2oa does the following:


oa2spef loads the oaPiElmore model or the oaPiPoleResidue model and gets the nearCap, farCap and resistor values.
load_desc ::= *LOADS rc_desc { rc_desc}

LOADS

The SPEF construct for LOADS is:

	*LOADS rc_desc  { rc_desc }
    
	rc_desc ::= *RC pin_name par_value { pole_residue_desc } 
	
	pole_residue_desc ::= *Q number_of_poles pole  { pole }  \
	                      *K number_of_residues residue  { residue }

pin_name maps to the oaDesignObject, which is one of the receivers for the driver, and par_value maps to the delay value. An oaElmore object stores the delay value associated with this receiver object. Each receiver's oaElmore object is associated with the reduced model (oaLumpedElmore or oaPiElmore) for this driver. If a pole_residue_desc is included, it is represented by an oaPoleResidue object in OpenAccess, which in turn, is associated with an oaPiPoleResidue model.

spef2oa creates oaElmore objects for each *RC section for the appropriate model if pole_residue_desc is not present. If pole_residue_desc is present, spef2oa creates the oaPoleResidue object to represent poles and residues.

oa2spef gets the oaElmore objects from oaPiElmore or oaLumpedElmore models for writing pin_name and par_value in the *RC section.

Return to top of page