For a complete overview of the new features in OpenAccess 2.2, see What's New in OpenAccess 2.2.
The information that follows describes updates and bug fixes for incremental releases of OpenAccess 2.2.
View a summary of the OpenAccess 2.2 p001 changes with respect to 2.2 b014.
View a summary of the OpenAccess 2.2 b014 changes with respect to OpenAccess 2.1.
verilog2oa, the wrong equivalent net is associated with the assign statement.oa20to22 crashes if the 2.0 library contains the techLibName property. .plg file is missing. View a summary of the OpenAccess 2.2 b014 changes with respect to 2.2 b013.
View a summary of the OpenAccess 2.2 b014 changes with respect to OpenAccess 2.1.
OpenAccess provides a script called oaGetLibPath that returns the path to the shared libraries for LD_LIBRARY_PATH, SHLIB_PATH, and LIB_PATH. Your application can use this script to set the library path for the OpenAccess libraries.
The script in available in <install_dir>/bin. The script has an optional mode, -numBits, that lets you override the bit mode specified by any environment variables.
View a summary of the OpenAccess 2.2 b013 changes with respect to 2.2 b012.
View a summary of the OpenAccess 2.2 b013 changes with respect to OpenAccess 2.1.
oa2def crashes if the tech does not contain a lefDefaultRouteSpec constraint.oa2verilog fails to produce InstTerm after importing data with def2oa.EMH
When using an occurrence hierarchy that has been expanded into occurrences of lower level designs, undo is not supported for certain combinations of operations. While undo is enabled, you can either change the annotations (properties, groups, appDefs, and parasitics) on the objects in the lower level design occurrences, or change connectivity in the top or lower level designs. Changing both annotations and connectivity while undo is enabled will generally cause a crash in either oaDesign::undo() or oaDesign::redo().
Documentation Status
Design Management
oaDMObject::destroy has no effect when called on an oaLib.
When a DM object is to be destroyed, none of the files contained within that object can be locked by another process. If any of the files are locked by another process, the destroy is denied and an exception is thrown.
View a summary of the OpenAccess 2.2 b012 changes with respect to 2.2 b011.
View a summary of the OpenAccess 2.2 b012 changes with respect to OpenAccess 2.1.
lef2oa uses the wrong default for layer offset.oa2def crashes on design created by oa20to22.Design Management
oaDMObject::destroy has no effect when called on an oaLib.
Documentation Status
The PCells example is not currently working.
Design Management
oaDMObject::destroy has no effect when called on an oaLib.
Documentation Status
The PCells example is not currently working.
Collections related to global nets are now supported in the occurrence domain.
Library transactions have been simplified so that you only need to get access to a library. The commit and rollback functionality that was available previously has been removed. Library changes, when made, are always persistent.
oaLib::startTrans() has been replaced by oaLib::getAccess(), and oaLib::endTrans() has been replaced by oaLib::releaseAccess(). oaLib::commitTrans() has been removed.
The oaLib API has changed from:
oaBoolean startTrans(oaDMTransType type,
oaUInt4 timeout = 0);
void commitTrans();
void endTrans();
oaBoolean hasTrans() const;
oaBoolean hasWriteTrans() const;
oaDMTransType getTransType() const;
to:
oaBoolean getAccess(oaLibAccess accessType,
oaUInt4 timeout = 0);
void releaseAccess();
oaLibAccessLevel oaLib::getAccessLevel()
The oaLibAccessLevel class has been added. This is an enum wrapper class that represents three levels of library access:
This release introduces the oaDMData class and four derived classes:
These classes let clients persistently associate properties, groups, appDefs, and appObjects with oaDMContainer objects (oaLib, oaCell, oaView, and oaCellView.)
The new oaDMData class derives from oaObject, and the database objects created using this class are managed objects. A new oaObject::isDMData() method has been added at the oaObject level as a verifier. Also, oaObject::getType() supports the new object types, which are oacLibDMDataType, oacCellDMDataType, oacViewDMDataType, and oacCellViewDMDataType respectively.
To set properties or extensions on DM objects, open the appropriate oaDMData for that object. For example, to read or write properties on an oaCellView, call oaCellViewDMData::open. This returns a pointer to an oaDMData object that you can then use to hold the cellView's properties.
The oaDMData database is treated like any other database; it can be opened, closed, and saved
A new get() method finds an existing cellView or creates and returns a new cellView if one does not exist.
static oaCellView *get(const oaLib *lib,
const oaScalarName &cellName,
const oaScalarName &viewName,
const oaViewType *viewType);
A new query method isDMData() at the oaObject level can be used to confirm whether or not an object is an oaDMData object.
oaBoolean isDMData() const;
When a file is locked by the current or any other process and a lock is requested, the lock request is denied.
When a DM object is to be destroyed, none of the files contained within that object can be locked. If any of the files are locked, the destroy is denied and an exception is thrown.
The class oaObserver<oaDMObject> is replaced by oaObserver<oaCell>, oaObserver<oaView>, oaObserver<oaCellView>, and oaObserver<oaDMFile>. The usage of the observer class remain the same -- it's just more strongly typed now.
Many function arguments that were formerly oaUInt4 or oaInt4 have been changed to use the typedefs: oaCoord, oaDist, or oaOffset. This typedef provides a better indication of the purpose of the argument.
In Tcl, coordinates and distances are floating-point numbers specified in user units, such as microns. These user units are converted to database units by the Tcl bindings.
This affects the following C++ types directly:
Database units are converted to user units directly by the Tcl binding whenever possible. For example, when you call the getWidth Tcl command on a path object, the width return value is converted from database units to user units, and the result is assigned to the Tcl result. This conversion is accomplished with oaTech conversion functions, as follows.
Type |
Database to user |
User to database |
oaCoord |
dbuToUU |
uuToDBU |
oaDist |
dbuToUUDistance |
uuToDBUDistance |
oaOffset |
dbuToUU |
uuToDBU |
These functions require the technology database and the view type. Tcl commands for C++ member functions that are derived from the oaDesignObject class obtain the technology database and the view type from their design. As a consequence of this automatic conversion, a technology database must be available on the design before functions involving this conversion can be called, otherwise a Tcl error results.
All Tcl command arguments that are related to the three types above are specified in user units, and are converted to database units. The procedure for this is similar to that of converting database units to user units.
There are a number of OpenAccess C++ classes that do not have technology databases, and a conversion is therefore not possible. The simplest example is the oaPoint class. This class is represented in Tcl by a list of two double values. The oaBox is another example of such a class that has a pure TCL representation. The oaPointArray is an example of a class that is represented by a user defined Tcl object.
oaDesign::getCellView() was removed because it implicitly accessed library data and required a call to oaLib::getAccess(). It is preferable to make this explicit and require the caller to do this.
OpenAccess has a new dependency on liboaCommon.so. You cannot build an executable without adding liboaCommon.so to the link line.
oa20to22 will map these values to oacPlacedPlacementStatus and oacLockedPlacementStatus, respectively. New function:
oaBoolean oaDesign::inUndo() const;
Removed function:
oaBoolean oaDesign::isCpNeeded() const;
Changed function:
oaBoolean oaDesign::setCp();
changed to:
void oaDesign::setCp();
View a summary of the OpenAccess 2.2 b011 changes with respect to 2.2 b010.
View a summary of the OpenAccess 2.2 b011 changes with respect to OpenAccess 2.1.
verilog2oa and scalarizing the design, the names of some nets in the block domain are incorrect.def2oa fails for an oaSegStyle with an extend or truncate end style.lef2oa uses the wrong units.def2oa creates the wrong extension for an oaPathSeg.-tieHigh and -tieLow options of verilog2oa should be marked global.verilog2oa does not equate tristate with inout.oa2spef regardless of whether or not the parasitic network has Terms or InstTerms that have nodes with coordinates. oa2spef.Design Management
EMH
Documentation Status
The PCells example is not currently working.
References to the same global signal in different occurrences are now merged into a single oaNet in the block domain.
View a summary of the OpenAccess 2.2 b010 changes with respect to 2.2 b009.
View a summary of the OpenAccess 2.2 b010 changes with respect to OpenAccess 2.1.
Design Management
EMH
Documentation Status
TCL Bindings
Examples
The following example is not currently working:
The argc and argv arguments have been eliminated from the oaDMInit, oaTechInit, oaDesignInit, and oaWaferInit functions. The new signatures are as follows:
void oaDMInit(oaUInt4 apiMajorRev = oacAPIMajorRevNumber,
oaUInt4 apiMinorRev = oacAPIMinorRevNumber);
void oaTechInit(oaUInt4 apiMajorRev = oacAPIMajorRevNumber,
oaUInt4 apiMinorRev = oacAPIMinorRevNumber);
void oaDesignInit(oaUInt4 apiMajorRev = oacAPIMajorRevNumber,
oaUInt4 apiMinorRev = oacAPIMinorRevNumber);
void oaWaferInit(oaUInt4 apiMajorRev = oacAPIMajorRevNumber,
oaUInt4 apiMinorRev = oacAPIMinorRevNumber);
The translators and the example programs have been updated accordingly.
The information in this section doesn't represent new functionality for b009. Rather, it elaborates on existing functionality.
There are two common scenarios for how a plug-in is loaded for OpenAccess:
.plg to the name of the plug-in and looks for a file of that name in the data/plugIns directory.
Each plug-in package installs its .plg file for use in Scenario 1 to the data/plugIns directory. oaDMTurbo before promotes an additional file called oaDMSystem.plg with the treatAs=”oaTurbo” statement in it. This establishes oaDMTurbo as the default plug-in for that category. In general, when troubleshooting a plug-in problem, look at the data/plugIns directory to see if everything looks correct, then look for the libraries that the .plg files are referring to.
Arguments and return values of functions in various classes, such as oaBox, oaPoint, and oaArrayInst have been changed from a generic oaUInt4 type to special types if the argument or return value represents a coordinate, distance or offset value, as follows:
• oaCoord represents a signed coordinate in 2D space.
• oaDist represents an unsigned distance in 2D space.
• oaOffset represents a signed offset in 2D space.
This conversion of generic integers to special types represents useful information for end-application users.
Note that this change is critical at the TCL level. Specifically, Cadence extension languages use user units, which are user-specified units that can be any units such as microns, mils, meters, angstroms, and so forth, rather than database units. These values therefore go through a conversion from (floating-point) user units to (integer) database units.
The following function returns the write path to this library.
The oaLibServer class is obsolete and has been removed.
The ability to perform read locking has been removed.
Topology is used on geometric routes, and geometric routes do not use oaRoutes. Accordingly, the topology attribute has been removed from oaRoute.
oaRoute::create() has been changed to:
static oaRoute *create(oaBlock *block,
oaNet *net = NULL,
oaBoolean isGlobal = false,
oaRouteStatus stat = oacNormalRouteStatus);
The following APIs have been removed:
oaRouteTopology getTopology() const; void setTopology(const oaRouteTopology &topology);
The oaAppDef* (pointer to the definition) is passed to the observer whenever any of its data changes.
From:
#define oavGuideIterBeginLayer 0x0001u
#define oavGuideIterEndLayer 0x0002u
#define oavGuideIterBeginAndEndLayers 0x0003u
To:
#define oacGuideIterBeginLayer 0x0001u
#define oacGuideIterEndLayer 0x0002u
#define oacGuideIterBeginAndEndLayers 0x0003u
View a summary of the OpenAccess 2.2 b009 changes with respect to 2.2 b008.
View a summary of the OpenAccess 2.2 b009 changes with respect to OpenAccess 2.1.
verilog2oa.
def2oa runs in update mode, it adds vdd/vss connections that appear in oa2verilog -- these connections should have block-only visibility.
oa2verilog: sticky isInterface bit causes bad connectivity.
verilog2oa, there are two nets in the block domain that have the same name but are identified as the same net.
oa20to22 does not translate routing direction correctly.
def2oa misses vias in SPECIALNETS.
oa2verilog modeling of unconnected term bits is not correct.
.oalib file is missing.
def2oa failed to translate DEF file with error: Error: Line 110109: Exception: Invalid syntax in input name.
lef2oa should also store WIDTH as an oacMinWidth foundry rule.
Design Management
EMH
Documentation Status
TCL Bindings
Examples
The following examples are not currently working:
You need to recreate your old libraries for b008 either by re-translating them or by recreating them from scratch. (This is due to a change in the format of the library description file (.oalib)).
Now that transactions are fully implemented, the following function is not needed and has been removed:
oaDMObject::release()
The following function returns the full path to the library:
void oaLib::getFullPath(oaString &fullPath) const;
The following function returns the name of the DM system associated with the library at creation time.
void oaLib::getDMSystemName(oaString &dmSystem) const;
Previously, the following function returned the library name and the DM system name in the list of attributes. This functionality is no longer needed and has been removed. The library name can be returned directly from an oaLib, and the DM system name can be queried directly.
oaLib::getAttributes()
You can now destroy a portion of an occurrence hierarchy using a new function, oaOccurrence::destroy(). Applications can use this capability to improve capacity and performance when performing significant edits in the block or module domain, which often invalidate all related occurrence annotations.
In addition, an optional argument has been added to several functions to control whether the occurrence hierarchy is expanded. In each session, an application must expand the occurrence hierarchy as much as needed. After doing so, the application can avoid expanding the occurrence hierarchy further by setting expand to false when calling the following functions:
oaOccInstTerm::getTerm(oaBoolean expand = true) const oaOccInst::getMasterOccurrence(oaBoolean expand = true) const oaOccModuleInstHeader::getMasterOccurrence(oaBoolean expand = true) const
The default oaRouteMethod for a new oaTerm or oaInstTerm has changed from oacGeometricRouteMethod to oacSymbolicRouteMethod. Specifically, the changes include the following:
–DMSystem option has changed to "oaDMSystem" for all translators. The "oaDMSystem" value indicates that the default DM plug-in, which is defined for the entire DM system, should be used rather than selecting a DM plug-in on a per library basis. -DMAttributes, has been added to translators that import data into OpenAccess. See the documentation for the individual translators for details. lef2oa is now update, and there is an –overwrite option to be consistent with the other translators.<application>.log. The -logFile option let's you choose a different name for the log file. The liblef and libdef static libraries, which comprise the LEF/DEF parsers, are no longer included in the OpenAccess installation because they are licensed separately. Note that the OpenAccess LEF/DEF translator executables are still available inside the distribution.
If you want to recompile the LEF/DEF translators, you need to download and compile the LEF/DEF parser from https://openeda.si2.org/projects/lefdef/. See Optionally Compiling Translators for instructions.
View a summary of the OpenAccess 2.2 b008 changes with respect to 2.2 b007.
View a summary of the OpenAccess 2.2 b008 changes with respect to OpenAccess 2.1.
lef2oa and def2oa. verilog2oa rejects valid Verilog statements.oa2spef writes nodes in both *I and *N sections.oa2strm does not recognize libraries from the libDefFile.lef2oa should not create duplicate lib.defs entries. oa2lef cannot find library translated by cdb2oa. lef2oa is corrupted. def2oa.
Design Management
EMH
Documentation Status
Examples
View a summary of the OpenAccess 2.2 b007 changes with respect to 2.2 b006.
View a summary of the OpenAccess 2.2 b007 changes with respect to OpenAccess 2.1.
Design Management
EMH
Documentation Status
Examples
spef2oa is the standard translator implementation that reads a SPEF file and annotates an OpenAccess database with parasitic information. The translator only adds parasitic information to an existing database. spef2oa does not create connectivity. The translator runs from the command line and includes options to control what information is read from the SPEF file and how the information is stored in the database.
For more information, see spef2oa Translator.
The purpose of this set of APIs is to provide a mechanism to open all the libraries in a library definition file as well as to provide an interface to update the contents of library definition files.
lib.defs) on disk.lib.defs and is searched for in the following order:
$HOMEOpenAccess will open libraries from the default library definition file using oaLibDefList::openLibs() if no other file is specified.
oaPointArray now derives from oaArray<oaPoint>.
As a result of this change, any {get,set}NumPoints() methods become {get,set}NumElements() methods.
The FileSys DM System now lets you access a library in non-shared mode via the oaLibMode class. When one client accesses a library in non-shared mode, no other client is allowed access to that library (no lock files will be produced for those other clients). This enhancement improves the performance of translators that create or update data in a library.
Note that the FileSys plug-in will not fail to open a library in non-shared mode if other clients have already opened the library.
To use the new non-shared mode, pass the oaLibMode argument with a value of oacNonSharedLibMode to oaLib::create() and oaLib::open() as follows:
newLib = oaLib::open(scalarLibName, libPath, "", oacNonSharedLibMode);
newLib = oaLib::create(scalarLibName, libPath, oacNonSharedLibMode, dmSystem);
The oaLib::getMode() method is now implemented.
oaTechInit() now automatically calls oaDMInit(). This affects the signature for oaTechInit(), adding two new arguments, argc and argv.
void oaTechInit(oaInt4 *argc,
char *argv[],
oaUInt4 apiMajorRev,
oaUInt4 apiMinorRev)
As a result of the changes in 2.2 to support bitwise connectivity, all the connectivity classes that have Busses (or Vectors) now have a Bit class for the single-bit objects, such as oaBitNet and oaBitTerm. Many member functions on the parent classes, such as oNet and oaTerm, are only used on single-bit objects, but previously had to be on the parent of the Scalar and Bus sub-classes. Functions that only apply to single-bit objects have been moved to the new Bit classes, and other functions with arguments or return values that refer to single-bit objects have changed to the more specific type.
The following member functions have been moved from oaNet to oaBitNet:
oaBoolean isPreferredEquivalent() const
oaNet* getPreferredEquivalent() const
oaRoutePattern getRoutePattern() const
oaFloat getVoltage() const
oaConnStatus getConnStatus() const
oaNet* getShieldNet1() const
oaNet* getShieldNet2() const
oaNet* getOriginal() const
void getParasiticConfidence(oaUInt4 &minValue,
oaUInt4 &maxValue) const
void setPreferredEquivalent()
void setRoutePattern(oaRoutePattern routePattern)
void setVoltage(oaFloat voltage)
void setConnStatus(oaConnStatus status)
void setShieldNet1(oaNet *shieldNet)
void setShieldNet2(oaNet *shieldNet)
void setOriginal(oaNet *original)
void setParasiticConfidence(oaUInt4 value)
void setParasiticConfidence(oaUInt4 minValue,
oaUInt4 maxValue)
void makeEquivalent(oaNet *equivNet)
void breakEquivalence()
oaCollection<oaSteiner, oaNet> getSteiners() const
oaCollection<oaVia, oaNet> getVias(oaUInt4 filterFlags = oacViaIterNetRoutes) const
oaCollection<oaNet, oaNet> getEquivalentNets() const
The following had return or argument types modified as appropriate for oaBitNet:
oaBitNet* getPreferredEquivalent() const oaBitNet* getShieldNet1() const oaBitNet* getShieldNet2() const void setShieldNet2(oaBitNet *shieldNet) void makeEquivalent(oaBitNet *equivNet) oaCollection<oaSteiner, oaBitNet> getSteiners() const oaCollection<oaVia, oaBitNet> getVias(oaUInt4 filterFlags = oacViaIterNetRoutes) const oaCollection<oaBitNet, oaBitNet> getEquivalentNets() const
The single-bit member net collection:
oaCollection<oaNet, oaNet> getSingleBitMembers() const
Was changed to contain oaBitNets:
oaCollection<oaBitNet, oaNet> getSingleBitMembers() const
The following member functions on oaShape and oaVia have been modified to refer to oaBitNet.
oaBitNet* oaShape::getShieldNet1() const oaBitNet* oaShape::getShieldNet2() const void oaShape::setShieldNet1(oaBitNet *net) void oaShape::setShieldNet2(oaBitNet *net) oaBitNet* oaVia::getShieldNet1() const oaBitNet* oaVia::getShieldNet2() const void oaVia::setShieldNet1(oaBitNet *net) void oaVia::setShieldNet2(oaBitNet *net)
The following member functions have been moved from oaModNet to oaModBitNet:
oaBoolean isPreferredEquivalent() const oaModNet* getPreferredEquivalent() const void setPreferredEquivalent() void makeEquivalent(oaModNet *equivNet) void breakEquivalence()
The following had return or argument types modified as appropriate for oaModBitNet:
oaModBitNet* getPreferredEquivalent() const
void makeEquivalent(oaModBitNet *equivNet)
oaCollection<oaModBitNet, oaModBitNet> getEquivalentNets() const
The single bit member net collection:
oaCollection<oaModNet, oaModNet> getSingleBitMembers() const
Has been change to contain oaModBitNets:
oaCollection<oaModBitNet, oaModNet> getSingleBitMembers() const
The following member functions moved from oaOccNet to oaOccBitNet:
oaBoolean isPreferredEquivalent() const
void getParasiticConfidence(oaUInt4 &minValue,
oaUInt4 &maxValue) const
oaCollection<oaOccNet, oaOccNet> getEquivalentNets() const
The following had return or argument types modified as appropriate for oaOccBitNet:
oaCollection<oaOccBitNet, oaOccBitNet> getEquivalentNets() const
The single-bit member net collection:
oaCollection<oaOccNet, oaOccNet> getSingleBitMembers() const
Has been changed to include oaOccBitNets
oaCollection<oaOccBitNet, oaOccNet> getSingleBitMembers() const
The following member functions have been moved from oaTerm to oaBitTerm:
oaRouteMethod getRouteMethod() const oaPinConnectMethod getPinConnectMethod() const oaRoutePattern getRoutePattern() const oaTerm* getSupplySensitivity() const oaTerm* getGroundSensitivity() const void getAntennaData(oaAntennaData &data,
const oaAntennaDataModel &model() const void setRouteMethod(oaRouteMethod routeMethod) void setPinConnectMethod(oaPinConnectMethod pinConnMethod) void setSupplySensitivity(const oaTerm *term) void setGroundSensitivity(const oaTerm *term) void setMustJoin(const oaTerm *term) void unsetMustJoin() void setAntennaData(const oaAntennaData &data) void unsetAntennaData(const oaAntennaDataModel &model) oaBoolean isAntennaDataSet(const oaAntennaDataModel &model) oaCollection<oaTerm, oaTerm> getMustJoinTerms() const
The following had return or argument types modified as appropriate for oaBitTerm:
oaBitTerm* getSupplySensitivity() const oaBitTerm* getGroundSensitivity() const void setSupplySensitivity(const oaBitTerm *term) void setGroundSensitivity(const oaBitTerm *term) void setMustJoin(const oaBitTerm *term) oaCollection<oaBitTerm, oaBitTerm> getMustJoinTerms() const
View a summary of the OpenAccess 2.2 b006 changes with respect to 2.2 b005.
View a summary of the OpenAccess 2.2 b006 changes with respect to OpenAccess 2.1.
oa20to22 translation of instTerms. oa20to22 translation of nets.verilog2oa performance issue.Design Management
SPEF Reader
EMH
Documentation Status
Examples
64-bit versions of the TCL bindings are now available.
Also, the commands to load the oaTcl shared library have changed, as shown in the following table.
Platform |
Command |
|---|---|
| Solaris | load oaTcl.so oa |
| Linux | load oaTcl.so oa |
| IBM | load oaTcl.so oa |
| HP | load oaTcl.sl oa |
| Windows | load oaTcl.dll oa |
void oaCellView::setView(const oaView *view);
This API changes the parent view of the cellView. If the viewType is changed, the primary file name also changes. If the primary file exists on disk, it is renamed.
An exception is thrown if another cellView already has the cellName and viewName that this cellView would have after the change is made. (oacCVExists).
An exception is thrown if a file already exists in the cellView with the same name that the primary file is to be renamed. (oacCVSetViewPrimaryFileExists)
An exception is thrown if the primary file cannot be write locked.
Bison 1.875-3 is now required for compiling the Verilog translators instead of Bison++. For more information, see Optionally Compiling Translators in the Installation and Configuration Notes.
getTech has been updated to first look for a local technology database, then look for an attached technology database.
If getTech finds a technology database in the library containing the design, it opens that local technology database (if it is not already open) and returns a pointer to that technology database.
If getTech does not find a local technology database, it looks for a library property called "techLibName". The techLibName property specifies a different library containing the technology database, which is called an attached technology database. If this property is found, getTech opens the attached technology database (if it is not already open) and returns a pointer to that technology database.
View a summary of the OpenAccess 2.2 b005 changes with respect to 2.2 b004.
View a summary of the OpenAccess 2.2 b005 changes with respect to OpenAccess 2.1.
Design Management
SPEF Reader
EMH
Documentation Status
Examples
The OpenAccess API is available in TCL, for version 8.4.1 and later. In order to use this, you need to install TCL 8.4.1. You can obtain this from:
If you compile the TCL bindings (oaLang package), there will be compilation warning messages. The OpenAccess team is aware of this issue and is working to correct it. Note that there is no need to compile the TCL bindings unless you want to work on a platform that is not one of the OpenAccess precompiled platforms.
Note: Only 32-bit versions of the TCL bindings are currently available. 64-bit versions will become available in a subsequent release.
Before you invoke the TCL shell:
You can invoke TCL from the command line. For example:
> tclsh8.4
This starts the TCL shell that came from the TCL distribution. You can now enter TCL commands. To see all available commands in the global TCL namespace, use the info command:
% info commands *
This returns:
tell socket subst open eof pwd glob list exec pid auto_load_index time unknown eval lrange fblocked lsearch auto_import gets case lappend proc break variable llength auto_execok return linsert error catch clock info split array if fconfigure concat join lreplace source fcopy global switch auto_qualify update close cd for auto_load file append format read package set binary namespace scan trace seek while flush after vwait uplevel continue foreach lset rename fileevent regexp upvar unset encoding expr load regsub history interp exit puts incr lindex lsort tclLog string
All OpenAccess commands are provided in the TCL namespace oa. To view commands in this namespace, enter:
% info commands oa::*
At this point, there aren't any available commands because the oaTcl shared library has not been loaded. To do so, use the TCL load command for your platform:
Platform |
Command |
|---|---|
| Solaris | load liboaTcl.so oa |
| Linux | load liboaTcl.so oa |
| IBM | load liboaTcl.so oa |
| HP | load liboaTcl.sl oa |
| Windows | load oaTcl.dll oa |
The info command now shows a long list of functions. To see the commands for opening libraries, use:
% info commands oa::Lib*
This returns:
::oa::LibDefFileAddLib ::oa::LibServerGetDefaultPortNum ::oa::LibDefFileGetLibDefFiles ::oa::LibDefFileIter ::oa::LibGetOpenLibs ::oa::LibDefFileGetCurrent ::oa::LibMode ::oa::LibCreate ::oa::LibDefFileRemoveLib ::oa::LibExists ::oa::LibServer ::oa::LibServerGetLocalHostName ::oa::LibDefFileCollection ::oa::LibServerFindServerFor ::oa::LibOpen ::oa::LibDefFileGetDefault ::oa::LibFind ::oa::LibDefFileLoad
Note that oa::LibCreate is in this list. To obtain information on a particular command use oa::help as follows:
% oa::help LibCreate
This returns:
LibCreate
name oaScalarName
libPath oaString
mode oaLibMode
dmSystem oaString
dmAttrList oaDMAttrArray
==> oaLib
Try creating a library, for example:
% oa::LibCreate myLib myLib
This returns an address such as:
oa:0x80013
There are sample scripts in your installation hierarchy in <install_dir>/examples/oa/tcl.
Exception #0 received from DM Interface component: Received exception Server unable to create library due to: Unable to create library myLib at path /home/oapv/myLib: OS error code: '13': "Permission denied" % exitThe following search path is now used by OpenAccess to locate lib.defs files.
./lib.defs$HOME/lib.defs<install_dir>/data/libraries/lib.defs
class OA_DM_DLL_API oaLibDefFile {
public:
static void load();
static void load(const oaString &path);
virtual oaBoolean onLoadWarnings(const oaString &path, const oaString &msg, oaLibDefFileWarningTypeEnum type);where the enum is defined as:
enum oaLibDefFileWarningTypeEnum { oacNoDefaultLibDefFileWarning = 0, oacCannotOpenDefaultLibDefFileWarning = 1, oacSyntaxErrorLibDefFileWarning = 2, oacCannotOpenIncludeLibDefFileWarning = 3, oacRecursiveIncludeLibDefFileWarning = 4, oacMultiDefinitionsLibDefFileWarning = 5, oacCannotOpenLibLibDefFileWarning = 6 };
The DM data transactions have not changed between b003 and b004. However, the following information about DM data transactions is more clear than the information in the b003 release notes.
A data transaction on a DM object can exist outside of the library transaction, as follows:
lib->startTrans(oacReadDMTransType); oaCell *cell = oaCell::find(dmLib, dmCellName); cell->startDataTrans(oacWriteDMTransType); dmLib->endTrans();
The library transaction is necessary to obtain the pointer for the DM object. A DM data transaction is then started for the DM object. The library transaction can be ended at this time, and other processes can now obtain library transactions and modify the library. However, any DM object that has an active library transaction is protected from destruction by other processes.
The DM object pointer remains valid because of the active DM data transaction.
While the DM object pointer is valid, it can be used to create and access DM data (properties). In addition, some DM APIs on the object that access information about that object can be used. Any other APIs are blocked because the caller does not have a valid library transaction. In particular, any API that returns information about other library objects is disallowed.
When the outermost data transaction is ended, the object pointer becomes invalid if there is no encompassing library transaction.
New APIs:
static oaParasiticNetwork *create(oaParasiticNetwork *parent);
static oaParasiticNetwork *create(oaParasiticNetwork *parent,
const oaString &name);
static oaParasiticNetwork *find(oaParasiticNetwork *parent,
const oaString &name);
void setBBox(const oaBox &bBox);
void getBBox(oaBox &bBox) const;
oaBoolean isLoaded();
oaBoolean isParent();
oaParasiticNetwork *getParent();
void load(oaBoolean allPartitions = false);
oaCollection<oaParasiticNetwork, oaParasiticNetwork> getPartitions() const;
Changed API:
static oaParasiticNetwork *load(const oaDesignObject *net,
const oaAnalysisPoint *ap,
oaBoolean allPartitions = false);
View a summary of the OpenAccess 2.2 b004 changes with respect to 2.2 b003.
View a summary of the OpenAccess 2.2 b004 changes with respect to OpenAccess 2.1.
The database version numbers have not changed since b003.
Design Management
SPEF Reader
TCL Bindings to OpenAccess
EMH
Documentation Status
Examples
The viewTypes in green are new reserved viewTypes, which are included because they are common viewTypes. There is no corresponding OpenAccess database representation for these new viewTypes.
enum oaReservedViewTypeEnum {
oacMaskLayout = 0,
oacSchematic = 1,
oacSchematicSymbol = 2,
oacNetlist = 3,
oacWafer = 4,
oacVerilogAMSText = 5,
oacVHDLAMSText = 6,
oacVerilogText = 7,
oacVHDLText = 8,
oacVerilogAText = 9
};
These are the corresponding viewType names:
oacVerilogAMSText "verilogAMSText" oacVHDLAMSText "VHDLAMSText" oacVerilogText "verilogText" oacVHDLText "VHDLText" oacVerilogAText "verilogAText"
In the FileSys plug-in, there is a specific file name associated with each viewType, as follows:
oacVerilogAMSText "verilog.vams" oacVHDLAMSText "vhdl.vhms" oacVerilogText "verilog.v" oacVHDLText "vhdl.vhd" oacVerilogAText "veriloga.va"
For more information about the new viewTypes, see OpenAccess 2.2 Libraries and DM API.
A data transaction on a DMObject can exist outside of the library transaction, as follows:
lib:startTransaction lib -> cell cell -> startDataTransaction lib:endTransaction
At this point, data cannot be accessed from the library or the cellView. Data can only be accessed from the cell itself. Other users can edit the library while the data transaction on the cell is occurring.
The data transaction can be closed directly from the cell.
For more information, see the Code Example - Referencing DMObjects with Active Data Transactions.
lib.defs files.
./lib.defs$HOME/lib.defs<install_dir>/data/libDefs/lib.defslibDefs subdirectory will change in B004. Two new APIs have been added to oaLib:
Iterator copy constructors no longer reset the target iterator.
Support for diagonal oaPathSegs and chamfered ends in oaSegStyles has been implemented. New constructors for oaSegStyle accommodate PathSegs with one chamfered and one square end. See oaPathSeg and oaSegStyle for details.
-libDefFile option to explicitly load a particular lib.defs file. If you don't supply the –libDefFile option, the default search mechanism of the DM system is used to locate the lib.defs file. lib.defs file with the definitions of the new libraries using the oaLibDefFile::addLib(oaLib*) API. The DM system determines which lib.defs file is updated and what information is stored in the lib.defs file. lib.defs file, even libraries in the current working directory. The default mode for all translators is append, which means that the translator can create new designs in the library but cannot overwrite existing designs. There is a new -overwrite option, which lets most translators overwrite existing designs and create new ones in the library. However, the verilogAnnotate translator always appends data to existing designs and does not accept the -overwrite switch.
Notes:
lef2oa does not overwrite the techDB when the -overwrite mode is specified. strm2oa previously used a -noOverwrite option to specify that existing cells were not to be overwritten, and the default was to overwrite. Now, the default is not to overwrite unless the -overwrite option is provided. Previously, in order to customize def2oa, you had to derive from the base translator class and the helper classes. Starting with B003, you need only derive from the helper class, then register your user derived helper classes with the base translator class.
The preModify and postModify methods on oaObserver< oaAppDef > now take the appDef as an argument. Also, the appDef observer no longer has onRead or onWrite methods.
Two new classes, IPcell and oaPcellLink, replace oaPcellDataObserver. IPcell is an interface class that contains the application-specific function for pcell processing. oaPcellLink creates the link between OpenAccess and the IPcell provided by your application. The following listings are excerpts from the oaDesignInterfaces.h and IPcellLink.h header files followed by brief descriptions of the functions.
class OA_DESIGN_DLL_API IPcell ...
//Public Methods:
public:
virtual oaPcellDef *getPcellDef() = 0;
virtual void getName(oaString &name) = 0;
virtual void onBind(oaDesign *design, oaPcellDef *pcellDef) = 0;
virtual void onUnbind(oaDesign *design, oaPcellDef *pcellDef) = 0;
virtual void onEval(oaDesign *design, oaPcellDef *pcellDef) = 0;
virtual void onRead(oaDesign *design, oaMapFileWindow &mapWindow, oaUInt4 &loc, oaPcellDef *pcellDef) = 0;
virtual void onWrite(oaDesign *design, oaMapFileWindow &mapWindow, oaUInt4 &loc, oaPcellDef *pcellDef) = 0;
virtual oaUInt4 calcDiskSize(oaPcellDef *pcellDef) const = 0;
class OA_DESIGN_DLL_API oaPcellLink ...
//Public Methods:
public:
void destroy();
// Static Public Methods:
oaPcellLink *find(const oaString &name);
oaPcellLink *create(IPcell *pcellIn);
oaPcellDef *getPcellDef(const oaString &name);
The find() function is intended for creating pcell links for IPcells that come in as a plug-in. The create() function is intended for creating in-memory IPcells.
class OA_DESIGN_DLL_API oaPcellDef ...
// Public Methods:
public:
oaPcellDef(IPcell *pcellIn);
virtual ~oaPcellDef();
An application can provide an IPcell for OpenAccess by either creating one in memory or through a pcell plug-in. Information about how you create an IPcell plug-in will be provided in a subsequent release. To create a memory pcell, the application must perform the following steps:
View a summary of the OpenAccess 2.2 b003 changes with respect to 2.2 b002.
View a summary of the OpenAccess 2.2 b003 changes with respect to OpenAccess 2.1.
verilog2oa if there is a mismatch between the terminal definitions in the leaf cell's LEF and the InstTerm specification in the input Verilog.oa2verilog generates bad connectivity to LEF busBit ports.oa2verilog generates an incorrect port range.oa2verilog should suppress redundant bus ranges.lib.defs file cannot be found.
This is the second Beta release of OpenAccess 2.2. The majority of the 2.2 functionality is complete, with the following exceptions:
Design Management
Routes
SPEF Reader
EMH
TCL Bindings to OpenAccess
Documentation Status
The following changes are required so that OpenAccess can recognize redundant shapes and vias. These changes might require minor source code updates to client code.
libPath option is interpreted as a complete path, and the basename of that path becomes the OpenAccess library. If the libPath is /usr1/myLibs/lib1, library data will be written to the directory /usr1/myLibs/lib1. If you supply the current working directory (.) as the libPath, the current working directory becomes an OpenAccess library. ./libName is used. The argument is passed to the oaLib::create() API. libPath is checked against the libPath as defined in that file. If the paths are different, it is an error. If the two paths point to the same directory on disk, the update proceeds. -templateFile option to accumulate and record command-line options in a file. The syntax of the template file is one option per line (without the leading dash). The pound character (#) at the beginning of a line is a whole-line comment character and blank lines are allowed. The –templateFile option may appear anywhere in command line. Options that are specified on the command line take precedence over options specified in the template file.-libPath argument. If not specified, the library is located at ./libName-libPath argument. This is only valid for input translators that support updating libraries. Nearly all of the individually named oa*Callback classes are replaced by instances of the oaObserver<> template. For example, oaNetCallback becomes oaObserver<oaNet>. The names and signatures of the virtual functions on the observer classes are the same as those on the oa*Callback classes.
The following classes, which do not apply to individual database objects, are not instances of a template. Note that they, too, have been renamed from oa*Callback to oa*Observer:
The oa20to22src source code migrator now handles changes for callbacks being replaced by observers.
The –srcLib argument has been removed. The library name specified by –lib is used for both the source and destination library.
For more information, about updating your libraries, see Automatically Updating 2.0.x Libraries to 2.2
Region query now supports true overlaps of query regions with object geometries.
OpenAccess code now uses the following compile time directives, which provide support for verbose mode. OpenAccess header files now use:
#if defined(...)
instead of:
#ifdef ...
For more information, see Compile Time Directives in the Coding Style Guide and Standards.
The oaOccTraverser class has been enhanced such that a concrete oaOccTraverser object is capable of traversing occurrences and occurrence objects across design boundaries. The public interface remains the same except that the traversal now produces all objects in the occurrence hierarchy that might span multiple designs.
OpenAccess no longer searches for a library definition file during the oaDMInit routine. Instead, a library definition file is loaded with oaLoadLibs. The search path has not changed:
./lib.defs$HOME/lib.defs<install_dir>/data/lib.defsIn addition, the -libDefFile command-line argument is no longer supported.
A temp file is used as a temporary storage location that is associated with a DM object. An application can obtain a temp file path to use with oaDMObject::getTempFile. This request is passed to the plug-in, which returns a unique path.
The sameFileSystem argument specifies whether the file must be created in the same file system as its associated oaDMObject, or if it can be created in a different file system preferred by the plug-in.
Applications should delete the temp file when done with it. The plug-in will delete the temp file if the DM object associated with the temp file is destroyed. (This is not yet implemented).
// *****************************************************************************
// oaDMObject
// *****************************************************************************
class OA_DM_DLL_API oaDMObject : public oaObject {
public:
void getTempFile(oaString &path,
oaBoolean sameFileSystem = false) const;
};
DM Library and data transactions are available in oaLib and oaDMObject, respectively.
Library and data transactions now support nesting. You can start a transaction within the scope of a current transaction. The new transaction becomes the active transaction. However, transactions cannot be upgraded in scope, so it is an error to start a write transaction within the scope of a read transaction.
Each inner transaction must commit the changes to be saved. However, changes are not actually saved until the outermost transaction commits its changes. If a transaction ends before its changes are committed, the changes are discarded. (Note: This is not yet fully implemented for libraries).
Rollback is not implemented for write transactions that are ended with being committed.
Library data access must occur within the scope of a library transaction.
Similarly, DM data access must occur within the scope of a DM data transaction.
Note: The APIs in green below are new for B002.
oaBoolean oaLib::startTrans(oaDMTransType type,
oaUInt4 timeout)
Returns true if a library transaction can be obtained. The timeout is in seconds. Returns FALSE if a library transaction cannot be obtained within the timeout limit.
void oaLib::commitTrans()
Commits (saves) the effects of the transaction. It is an error if the active transaction is not a write transaction.
void oaLib::endTrans()
Ends the active transaction. It is an error if there is no transaction.
oaDMTransType oaLib::getTransType()
Returns the type of the active library transaction.
oaBoolean oaLib::hasTrans()
Returns TRUE if the there is a transaction of any type on the library.
oaBoolean oaLib::hasWriteTrans()
Returns TRUE if the outermost transaction of a library is of the type oacWriteDMTransType.
oaBoolean oaDMObject::startDataTrans(oaDMTransType type, oaUInt4 timeout)
Returns TRUE if a DM data transaction can be obtained. The timeout is in seconds. Returns FALSE if a DM data transaction cannot be obtained within the timeout limit.
void oaDMObject::commitDataTrans()
Commits (saves) the effects of the transaction. It is an error if the active transaction is not a write transaction.
void oaDMObject::endDataTrans()
Ends the active DM data transaction. It is an error if there is no active transaction.
oaDMTransType oaDMObject::getDataTransType()
Returns the type of the active DM data transaction (or current transaction).
oaBoolean oaDMObject::hasDataTrans()
Returns TRUE if there is a DM data transaction of any type on the object.
oaBoolean oaDMObject::hasWriteDataTrans()
Returns TRUE if the outermost DM data transaction on the object is of the type oacWriteDMTransType.
oaBoolean oaDMObject::isDMDataCurrent() const
Returns a boolean indicating whether or not the DM data in the caller's current data transaction is up-to-date with the on-disk representation. A write transaction can modify the DM data such that the read transaction data is no longer current. This function should be called within a data transaction, otherwise it throws an exception.
oaTimeStamp oaDMObject::getDMDataTimeStamp() const
Returns the timestamp associated with this DM data on this DM object in the current data transaction. This function should be called within a data transaction, otherwise it throws an exception.
Examples
This example creates a cellView, then adds a property to the cellView.
lib->startTrans(oacReadDMTransType);
cell->startDataTrans(oacWriteDMTransType);
oaIntProp::create(cell, "p_cell_int", 12);
prop = oaProp::find(cell, "p_cell_int");
cell->commitDataTrans();
cell->endDataTrans();
lib->endTrans;
This example shows a read transaction being used to get the path to the primary file in a cellView.
oaNativeNS nameSpace; oaString filePath(40); lib1->startTrans(oacReadDMTransType); oaCell *cell = oaCell::get(lib1, oaScalarName(nameSpace, "cellName")); oaView *view = oaView::get(lib1, oaScalarName(nameSpace, "viewName")); oaCellView *cv = oaCellView::get(cell, view); oaDMFile *cvfile = cv->getPrimary(); cvfile->getPath(filePath); lib1->endTrans();
The oaLibDef class has been removed.
The following APIs support an easier library management approach in which you do not need to define a library before using it. All the APIs are new except for oaLib::find, which is modified.
// ***************************************************************************** // This function creates the library using the specified name and attributes. // // It is an error if the library with the name already exists, or the libPath // directory is not valid or already exists. // ***************************************************************************** oaLib*
oaLib::create(const oaScalarName &name, const oaString &libPath, oaLibMode mode = oacSharedLibMode, const oaString &dmSystem = "oaDMTurbo", const oaDMAttrArray *dmAttrList = NULL)
// *****************************************************************************
// This function opens an existing library at the given path, using the
// specified name and attributes.
//
// It is an error if the library is already open, or the given name does
// not match the real name of the library at the given path.
// *****************************************************************************
oaLib*
oaLib::open(const oaScalarName &name,
const oaString &libPath,
const oaString &writePath = "",
oaLibMode mode = oacSharedLibMode)
// ***************************************************************************** // This function attempts to find an open library. If found, a pointer to // that library is returned. If the library cannot be found, NULL is returned. // ***************************************************************************** oaLib* oaLib::find(const oaScalarName &name)
// ***************************************************************************** // This function closes the library. All of its contents become not accessible, // all the transactions will end and the non-commited changes will be lost. // ***************************************************************************** void oaLib::close()
// ***************************************************************************** // This function returns true if there's a library on the given libPath. // ***************************************************************************** oaBoolean oaLib::exists(const oaString &libPath)
For API consistency, a few object methods have been renamed to make them more predictable and consistent with other API methods:
The following enums have been removed from oaInstAttrTypeEnum:
These new methods represent the effective width of a layer blockage for minimum spacing lookup.
The following changes were made to support symmetry in layer pair constraint defs:
Removed APIs:
Added APIs:
View a summary of the OpenAccess 2.2 b002 changes with respect to 2.2 b001.
View a summary of the OpenAccess 2.2 b002 changes with respect to OpenAccess 2.1.
Library file storage, synchronization, and version-control management is handled through an interface that communicates with a DM system plug-in. OpenAccess provides two DM systems that you can choose from when you create a library:

Creating a Library Definition
Before creating a library, you must define it. A library definition must specify the library name and the library path as well as an optional specification for DM system for the library. If you do not specify a DM system, Turbo DM is the default.
The DM system applies to all the designs in the library.
You can define a library in two ways:
lib.defs file) Note: Currently, multi-user access of libraries is not supported.
First, create the library definition:
oaLibDef *libDef = oaLibDef::create(libName, libPath);
Next specify the DM system for your library as an attribute. The default DM system is oaDMTurbo.
//Replace sysName with either oaDMTurbo or oaDMFileSys
libDef->addAttribute("DMSystem", "sysName");
You can define a library using a library definition file:
DEFINE libName libPath ASSIGN libName DMSystem sysName
Where
sysNameis one ofoaDMTurbooroaDMFileSys.
OpenAccess searches for a library definition file during the oaDMInit routine. The library definition is loaded if found. OpenAccess searches for a library definition file in the following order:
./lib.defs$HOME/lib.defs<install_dir>/data/lib.defsLibrary access is now controlled by library-level transactions. There are three functions for controlling transactions:
void oaLib::startTrans(oaDMTransType, timeout); void oaLib::commitTrans(); void oaLib::endTrans();
The following functions let you get information about transactions:
oaBoolean oaLib::hasTrans() const; oaDMTransType oaLib::getTransType() const;
Before any library structure data (such as oaCells, oaViews, oaCellViews, oaDMFiles, and their attributes) is accessed, the application must obtain a read transaction. Before changing anything in the library structure, the application must obtain a write transaction.
Accessing data on the oaLib class itself does not require a transaction. Transactions cannot be nested. Transactions persist until ended.
Design, wafer, tech, and parasitic database functions have built-in transaction access.
OpenAccess includes a sample VC System plug-in. The sample provides the boiler-plate code required to create a working VC system that can be plugged into an existing DM system (for example, DMTurbo or DMFileSys). The DM system can then present the VC interfaces as though both systems are one unit. The implementation details of this are presented in the sample.
You can copy the sample plug-in code to a development area and fill in the functions that are marked “not yet implemented.” Changing the names of the classes is optional, but changing the name of the plug-in is mandatory. You change the name of the plug-in by changing the name of the oaVCPlugSample.plg file. The root name of this file corresponds to the name of the plug-in. Inside the file, the value in quotations is the root name of the shared library of the plug-in. For example, a VC system called MyVCSystem built in a library named libMyVCSystem.so (on Solaris) would ship with a file called MyVCSystem.plg , which contains the following line of text:
<<plugIn lib="MyVCSystem"/>
The primary interface that this plug-in implements is IVersionControl, which is the interface that OpenAccess uses to interact with the version control system. The comments in the oaVCPlug.cpp file help identify the purpose of each of these functions.
Note: The example does not currently show the implementation of the IVCSystem interface – this will be shown in a future version of the sample.
Library file storage, synchronization, and version-control management is handled through the DM interface socket, which communicates with a DM System plug-in. OpenAccess provides two DM Systems, as outlined in Design Management. If you want to create your own DM System, or add a version-control system, refer to the Design Manager Plug-In API Documentation for more information.
The following limitation applies to this release of oa20to22. (This limitation will be removed in subsequent releases.)
-DMSystem command-line option. Also, some of the command-line option names have changed to be more clear:-srcCdsLib path Source Library definition file -srcLib library Source Library to translate -lib library Destination Library name [-libPath path] Path to which the destination library is written [-DMSystem sysName] Name of the DM library system, such ‘oaDMFileSys' for Cadence 5.X library mode [-help | -h] Prints command-line help [-logFile name] Name of the log file [-version | -v] Prints version information
The following modifications occur during the translation:
2.0 Value 2.2 Simple Constraint Type
viaDefArray oacValidRoutingVias
layerSpecArray oacValidRoutingLayer
2.0 Layer Value in the layerSpecArray 2.2 Layer Constraint Type
layer width in layerSpecArray oacMinWidth
layer spacing in layerSpecArray oacMinSpacing
diagWidth in layerSpecArray oacMinDiagonalWidth
diagSpacing in layerSpecArray oacMinDiagonalSpacingThe width and spacing values (both regular and diagonal) for each layer in the layerSpecArray become corresponding constraints on the layer. The isHard attributes for these layer constraints are set according to the isWidthFixed and isSpacingFixed values of the layer spec.
The following topics describe changes between between earlier development versions of 2.2 and the current Beta release. For more information about these projects, refer to the OpenAccess 2.2 Development Release Notes.
The following translators now have command-line arguments for specifying an optional design library path and DM system, as well as a technology library path and its DM system.
The syntax for the new command-line arguments is as follows:
[-lib name] Name of the design library to create or use. [-libPath path] Path to the design library to create or use. The default is the current working directory. [-DMSystem sysName] DM system to use: either oaDMTurbo or oaDMFileSys. The default is oaDMTurbo. [-techLib name] Name of the technology library to create or use. [–techLibPath path] Path to the technology library to create or use. The default is the current working directory. [-techDMSystem sysName] DM system to use: either oaDMTurbo or oaDMFileSys. The default is oaDMTurbo.
1. The def2oa translator doesn't include the -techLib, -techLibPath, or -techDMSystem options because it doesn't create a technology library.
These options are ignored if the corresponding library is already defined in a library definition file.
To see the complete list of options for any translator, type the name of the executable followed by -h.
For all translators that previously had a -library option (or -oaLib in the case of mw2oa), the option is now called -lib.
The lef2oa translator now creates constraints instead of rules. lef2oa also now creates oaViaSpec objects.
oaViaSpec has been updated so that there is only one viaSpec object for any layer pair.
To get the valid viaDefs to use:
This release eliminates a 2.1 restriction that limited you to creating only single-bit oaModModuleVectorInsts. The majority of the public APIs are new -- the only exceptions are the items in green text, which are unchanged:
class OA_DESIGN_DLL_API oaModModuleVectorInst : public oaModModuleInst {
public:
static oaModModuleVectorInst *create(oaModule *module,
oaModule *master,
const oaScalarName &baseName,
oaUInt4 start,
oaUInt4 stop);
static oaModModuleVectorInst *create(oaModule *module,
const oaScalarName &masterModuleName,
const oaScalarName &baseName,
oaUInt4 start,
oaUInt4 stop);
static oaModModuleVectorInst *find(const oaModule *module,
const oaScalarName &baseName,
oaUInt4 start,
oaUInt4 stop);
static oaBoolean isValidName(const oaModule *module,
const oaScalarName &baseName,
oaUInt4 start,
oaUInt4 stop);
oaModVectorInstDef *getDef() const;
oaUInt4 getStart() const;
oaUInt4 getStop() const;
oaModModuleVectorInstBit *getBit(oaUInt4 bitIndex);
void setBaseName(const oaScalarName &baseName);
void setRange(oaUInt4 start,
oaUInt4 stop);
};
The following new features are available:
DATA[0:3], on a vectorInst, IO[0:3], the connection width is 16; The net used to make the connection must be 16 bits wide. OpenAccess now supports the specification and resolution of assigned nets by an application. Applications can specify assigned nets as follows:
These connection definitions and assignments are automatically propagated to the occurrence domain. Applications can then directly query the terminal, instTerm, or net for the corresponding assigned net, which is returned as an occurrence net. OpenAccess also provides a diagnostic feature that applications can use to obtain the set of connection definitions and assignments that were inspected for resolving the assigned net.
The following APIs are now supported for oaOccTerm, oaOccNet, and oaOccInstTerm.
oaOccNet *getAssignedNet(oaBoolean ignoreDefault = false ) const ;
oaOccNet *getAssignedNet(oaAssignedNetSpec &spec,
oaBoolean ignoreDefault = false ) const ;
Starting with this release, after expanding the occurrence hierarchy into different oaDesigns, it is possible to change the connectivity within those lower-level oaDesigns . If the changes are made while the lower-level oaDesign is bound into the top-level occurrence hierarchy, all occurrences of the design will automatically be updated to reflect the changes. If the lower-level oaDesign is edited in isolation, the next time the top level-design is opened, occurrence-based annotations will be discarded for all occurrences of the design.
Collections in the occurrence domain and collections going between domains are fully supported. In addition, find() with a hierarchical path name is supported for objects within an occurrence of a lower-level design. A set of getPathName() methods are now available on occurrence objects; these return the full path name through the occurrence hierarchy to the object.
void oaAnalysisLib::getFormat(oaString &format);
replaces:
void oaAnalysisLib::getAnalysisLibType(oaString &type);
void oaAnalysisLib::setFormat(const oaString &format);
replaces:
void oaAnalysisLib::setType(const oaString &type);
Removed the following methods from oaRoute:
oaNet *getShielding1() const;
oaNet *getShielding2() const;
oaBoolean isUnShielded() const;
void setShielding1(oaNet *net);
void setShielding2(oaNet *net);
void setUnShielded(oaBoolean unshielded);
The following similar methods have been added to oaShape and oaVia :
oaNet *getShieldedNet1() const;
oaNet *getShieldedNet2() const;
oaBoolean isUnShielded() const;
void setShieldedNet1(oaNet *net);
void setShieldedNet2(oaNet *net);
void setUnShielded(oaBoolean unshielded);
The oaViaSpec object has been updated to include both a default value and a width-based lookup table value.
This section provides details about specific API changes. For a complete list of all the API changes, see the API Change Reports.
oaLib:
oaCollection<oaView, oaLib> getViewsByName(const oaScalarName &name) const;
oaView:
static oaView *find(const oaLib *lib, const oaScalarName &name, const oaViewType *viewType);
replaces:
static oaView *find(const oaLib *lib, const oaScalarName &name);
void oaViaSpec::getName(oaString &name) const;
void oaViaSpec::getViaDefs(oaViaDefArray &viaDefs) const;
oaBoolean oaViaSpec::getRangeLayer1(oaUInt4 &minWidth,
oaUInt4 &maxWidth) const;
oaBoolean oaViaSpec::getRangeLayer2(oaUInt4 &minWidth,
oaUInt4 &maxWidth) const;
void oaViaSpec::setRangeLayer1(oaUInt4 minWidth,
oaUInt4 maxWidth);
void oaViaSpec::setRangeLayer2(oaUInt4 minWidth,
oaUInt4 maxWidth);
void oaViaSpec::resetRangeLayer1();
void oaViaSpec::resetRangeLayer2();
These new oaViaSpec APIs:
static oaViaSpec *create(const oaPhysicalLayer *layer1,
const oaPhysicalLayer *layer2,
oaViaDefArrayValue *defaultValue); static oaViaSpec *create(const oaPhysicalLayer *layer1,
const oaPhysicalLayer *layer2,
oaViaDef2DTblValue *value); static oaViaSpec *create(const oaPhysicalLayer *layer1,
const oaPhysicalLayer *layer2,
oaViaDefArrayValue *defaultValue,
oaViaDef2DTblValue *value); static oaViaSpec *find(const oaPhysicalLayer *layer1,
const oaPhysicalLayer *layer2);
Replace these oaViaSpec APIs:
static oaViaSpec *create(oaTech *tech,
const oaString &name,
oaPhysicalLayer *layer1,
oaUInt4 layer1MinWidth,
oaUInt4 layer1MaxWidth,
oaPhysicalLayer *layer2,
oaUInt4 layer2MinWidth,
oaUInt4 layer2MaxWidth,
const oaViaDefArray &viaDefs);
static oaViaSpec *create(oaTech *tech,
const oaString &name,
oaPhysicalLayer *layer1,
oaPhysicalLayer *layer2,
const oaViaDefArray &viaDefs);
static oaViaSpec *find(const oaTech *tech,
const oaString &name);
oaViaDef2DTblValue *getValue() const; oaViaDefArrayValue *getDefaultValue() const; void setValue(oaViaDef2DTblValue *value); void setDefaultValue(oaViaDefArrayValue *value);
View a summary of the OpenAccess 2.2 b001 changes with respect to 2.2 a014.
View a summary of the OpenAccess 2.2 b001 changes with respect to OpenAccess 2.1.
The OpenAccess binaries now have wrapper scripts to automatically set appropriate environment variables. Review the Environment Variables section of the Installation and Configuration Notes to understand how this affects you and the changes that you need to make before using OpenAccess.
For a014, the libstdc++.so is included in the OpenAccess installation.
The platform directory names in the installation hierarchy have been updated to be more extensible. Refer to Environment Variables in the Installation and Configuration Notes for more information.
The following objects are still included in the code, but are being replaced by constraints and constraint groups in a subsequent release:
The following limitations apply to this release of oa20to22. (These limitations will be removed in subsequent releases.)
oa20to22 use the Turbo DM Plug-In. (The -libmode option for compatibility with previous file-system based library structure is not yet supported.) The following objects are now translated:
The following modifications occur during the translation:
2.0 Rule Type 2.2 Constraint Type
oacMinAreaRule oacMinArea
oacMinEnclosedAreaRule oacMinEnclosedArea
oacMinDensityRule oacMinDensity
oacMaxDensityRule oacMaxDensity
oacMinEdgeLengthRule oacMinEdgeLength
oacMinSpaceRule oacMinSpacing
oacMinDiagonalSpaceRule oacMinDiagonalSpacing
oacMinDiffPontentialSpaceRule oacMinDiffPotentialSpacing
oacMinEnclosedSpaceRule oacMinEnclosedSpacing
oacMinFillPatternSpaceRule oacMinFillPatternSpacing
oacMinProximitySpaceRule oacMinProximitySpacing
oacMinProtudedProximitySpaceRule oacMinProtrudedProximitySpacing
oacMinSameNetSpaceRule oacMinSameNetSpacing
oacMinAdjacentViaSpaceRule oacMinAdjacentViaSpacing
oacMergeSpaceAllowedRule oacMergeSpaceAllowed
oacMinWidthRule oacMinWidth
oacMinDiagonalWidthRule oacMinDiagonalWidth
oacMinProtrusionWidtRule oacMinProtrusionWidth
oacMaxWidthRule oacMaxWidth
oacMinNumCutRule oacMinNumCut
oacMinProtrusionNumCutRule oacMinProtrusionNumCut
oacDefaultAntennaRule Default model in oacAntenna
oacSecondAntennaRule Second model in oacAntenna
oacPeakACCurrentDensityRule Converted into layer attribute
oacAvgACCurrentDensityRule Converted into layer attribute
oacRmsACCurrentDensityRule Converted into layer attribute
oacAvgDCCurrentDensityRule Converted into layer attribute
oacMinButtedAreaRule Obsolete
2.0 Rule Type 2.2 Constraint Type
oacMinClearanceRule oacMinClearance
oacMinSameNetClearanceRule oacMinSameNetClearance
oacMinExtRule oacMinExtension
oacCoincidentExtRule oacCoincidentExtensionAllowed
oacMinOverlapRule oacMinOverlap
oacViaStackingAllowedRule oacViaStackingAllowed
oacMinOppositeExtRule oacMinDualExtension
oacMinButtedClearanceRule Obsolete
isSide attribute is set to true. Otherwise, the regular gate and diode area ratios are used and the isSide attribute is set to false.Value = Maximum number of vias allowed in stack Lower layer parameter = Bottom layer of the stack Upper layer parameter = Top layer of the stack
oa20to22 only creates these constraints when one of the area ratios is non-zero. The isSide attribute is set on the 2.2 antenna ratio value when either one of the ratio’s isSide attributes is set on the 2.0 cumulative ratio values.oacRouteDirHorz oacHorizontalRouteGridPitch oacHorizontalRouteGridOffset oacRouteDirVert oacVerticalRouteGridPitch oacVerticalRouteGridOffset oacRouteDirLeftDiag oac135RouteGridPitch oac135RouteGridOffset oacRouteDirRightDiag oac45RouteGridPitch oac45RouteGridOffset
This release contains significant enhancements to the functionality of the occurrence domain. Previously, the occurrence hierarchy for a top-level oaDesign could only be expanded to the leaf level within the same design (to oaOccDesignInsts). For an oaOccDesignInst, getMasterOccurrence() always returned NULL.
You can now expand the occurrence hierarchy across multiple levels of oaDesign hierarchy. You can use this capability to create a fully unfolded view of the design hierarchy when the same implementation of a block is reused several times on a chip. In the block domain, there is only one set of oaObjects for the contents of the block. In the occurrence domain, there is a set of oaObjects representing the contents of the block for each usage of the block within the chip. The occurrence domain stores all context-dependent information such as timing, power, and signal integrity, such that distinct values are on the oaObjects for each usage of the block.
You can decide how far the occurrence hierarchy should be expanded for your application. When characterized models for a master are used in analysis, it usually does not make sense to expand into occurrences of that master because there is no unique information about the contents of the master to justify the overhead. Creating occurrence data for all of the primitive occurrences in a 50 million gate design is unlikely to be desirable. Because characterized models can be created for blocks as well as for gate-level primitives, and the application chooses which set of models to use for a given analysis, OpenAccess requires the application to control the expansion in each session.
An occurrence hierarchy can contain a mixture of oaOccModuleInsts (occurrences of instances of a module) and oaOccDesignInsts (occurrences of instances of a design). In the OpenAccess module domain, an instance of a module is defined and stored in the same database as that module, while an instance of a design is defined and stored in a different database than that design. The same is not true in the occurrence domain for instances of oaOccurrences. In the occurrence domain, all objects in a given occurrence hierarchy are stored in the same database as the top oaOccurrence. However, starting with the current release, the definition of the structure of the full occurrence hierarchy, as well as the set of objects within each level of the hierarchy, can come from multiple design databases.
OpenAccess does not store a complete copy of the contents of the oaDesign database for each occurrence of an oaDesign, as this would use too much memory. Instead, OpenAccess uses the oaDesign itself as the basis for defining the occurrence hierarchy, leveraging the fact that the structural connectivity within a given oaDesign is applicable to every occurrence of that oaDesign in a chip.
The oaOccInst::getMasterOccurrence() function serves two purposes.
When descending into the master occurrence for an oaOccDesignInst, OpenAccess automatically loads the oaDesign database containing the definition of the master, if it is not already in memory. If the oaDesign cannot be bound, getMasterOccurrence() returns NULL indicating that the definition of the connectivity for that portion of the occurrence hierarchy is unavailable.
After expanding the occurrence hierarchy into different oaDesigns, you cannot currently change the connectivity within those lower-level oaDesigns. In a subsequent release, OpenAccess will handle connectivity changes to lower-level oaDesigns, both when the lower-level oaDesign is bound into the top-level occurrence hierarchy, and when the lower-level oaDesign is edited in isolation.
Many of the basic collections (for example, all objects of a given type within an oaOccurrence, instTerms on an instance, instTerms and terms on a net, and bus and bundle objects to member objects) are supported in the current release. Some less frequently used collections, such as oaOccNet::getMemberNets(), are not yet supported. Collections going from module or block domain objects to occurrence domain objects, such as oaModInst::getOccInsts() and oaInst::getOccInsts(), are not currently supported.
Most methods on occurrence objects are supported. However, although some object types allow find() with a hierarchical path name, this is not yet supported when the object is within an occurrence of a lower-level design.
You cannot currently destroy objects in the occurrence hierarchy itself, although it is possible to destroy property, group, extension, and parasitics objects annotated on the occurrence hierarchy.
Under the use model for OpenAccess managed objects, all managed objects must be created using the create() method and destroyed using the destroy() method. That is, OpenAccess does not provide the standard C++ constructors, copy constructors, destructors, or assignment operators for the managed object classes.
For example, the following operations are not allowed:
oaPolygon polygon; oaPolygon polygonC(polygon); oaPolygon *polygon1 = new oaPolygon; oaPolygon *polyArray = new oaPolygon[10];
… polygon = *polygon1;
… delete polygon1; delete [] polyArray; This paradigm is not new in OpenAccess, but it was not stricly enforced before, which sometimes confused new users.
This paradigm will now be strictly enforced as follows:
To enforce this paradigm, the constructor, copy constructor, and assignment operator are now private for the oaObject class that is the root abstract base class for the OpenAccess managed objects. Also, the destructor is protected and will throw an exception if invoked.
OpenAccess does not subdue compiler warnings that might be important for client code. However, recent versions of the gcc compiler unfortunately (for complex applications) generate warnings for private constructors by default. You can suppress these warnings using the –Wno-ctor-dtor-privacy compiler option. The following is a note from the GNU C++ Renovation Project:
“ The compiler warns when a class contains only private constructors or destructors, and has no friends. At the request of some of our customers, we have added a new option, ` -Wctor-dtor-privacy ' (on by default), and its negation, ` -Wno-ctor-dtor-privacy ', to control the emission of this warning. If, for example, you are working towards making your code compile warning-free, you can use ` -Wall -Wno-ctor-dtor-privacy ' to find the most common warnings.”
def2oa translator, the -update mode is implemented. The default mode of def2oa now updates an existing logical (Verilog) design. You cannot update existing physical designs, and the behavior in that case is currently undefined. To disable updating, use the –overwrite option. You can now update existing OpenAccess data with terminal ordering information from a Verilog file. For more information, see Verilog Annotation Tool (verilogAnnotate).
This release includes changes to the instance data model to support bitwise connectivity, as follows:
Notes
def2oa translator has been updated to create vectorInstBits instead of single-bit vectorInsts. A new locking API is available on the oaDMFile Class:
oaBoolean getLock(oaDMLockType type = oacDMWriteLock);
Gets a lock on the current file. The type argument specifies which kind of lock to get. If the lock is successfully obtained, true is returned. Otherwise, false is returned. Currently, no lock is taken, and this function always returns true.
void releaseLock();
Releases the lock on the current file.
oaDMLockStatus getLockStatus() const;
Gets the lock status of the current file. Currently, this function always returns the oacNotLocked status.
This class implements an enumerated type, which designates the type of lock:
// *****************************************************************************
// oaDMLockType
// *****************************************************************************
class oaDMLockType {
public:
oaDMLockType(oaDMLockTypeEnum valueIn);
oaDMLockType(const oaString &name);
const oaString &getName() const {return names[value];}
operator oaDMLockTypeEnum() const {return value;}
private:
oaDMLockTypeEnum value;
static const oaString names[];
};
This class implements an enumerated type, which describes the lock status:
// *****************************************************************************
// oaDMLockStatus
// *****************************************************************************
class oaDMLockStatus {
public:
oaDMLockStatus(oaDMLockStatusEnum valueIn);
const oaString &getName() const {return names[value];}
operator oaDMLockStatusEnum() const {return value;}
private:
oaDMLockStatusEnum value;
static const oaString names[];
};
The following API has been removed: oaLib::getServer();
Important: The following library is new and is required for linking with OpenAccess: oaPlugIn.
The
getTypefunction name has been changed to be more descriptive:void getType(oaString &name) const;changed to
void getAnalysisLibType(oaString &name) const;
oaAreaBlockage and oaAreaHalo no longer take an oaBlockageType argument, and their types default to oacPlacementBlockageType. Also, the oacPlacementBlockageType is not allowed for oaLayerBlockage and oaLayerHalo, and an exception will be thrown if this is used.
View a summary of the OpenAccess 2.2 a014 changes with respect to 2.2 a013.
View a summary of the OpenAccess 2.2 a014 changes with respect to OpenAccess 2.1.
lef2oa error: Cannot set antennaData on an implicit terminal.oa2def crashes when translating a pin with zero figures.oa2strm should write paths for pathSegs when possible. In future releases, more functionality will be added: iterators, find methods, and the ability to get constraint groups for various objects.
The infrastructure is in place for providing version information for OpenAccess executables. For example, if you type oaTest -v at a command prompt, you get the following:
Tool: oaTest 02.02-a013 Jun 4 2004 06:00 Library: oaBase 02.02-a013 Jun 4 2004 06:00 Library: oaDM 02.02-a013 Jun 4 2004 06:00 Library: oaTech 02.02-a013 Jun 4 2004 06:00 Library: oaDesign 02.02-a013 Jun 4 2004 06:00 Library: oaWafer 02.02-a013 Jun 4 2004 06:00 Library: oaUnitTest 02.02-a013 Jun 4 2004 06:00
Note: Not all the OpenAccess executables have been updated to use this approach yet.
mustJoin terminals are implemented.
Because instTerms will be introduced as part of the needed functionality for creating a multi-bit connection, a query has been added to instTerm objects to check whether instTerms are implicit. Until implicit instTerms are actually available in a future release, this function will return false.
The following APIs have been removed because their behavior was problematic for some cases:
Equivalence is transitive, so if nets A and B are equivalent, and nets B and C are equivalent, then A and C are equivalent. In a set of three or more equivalent nets like this, it is not possible to remove just the equivalence between A and B while preserving equivalence between B and C, and between A and C. Instead, a net must be completely removed from an equivalent set, breaking all of the equivalence relationships between that net and the other nets in the set. This capability is still available with the following APIs:
The translator class name has changed from oaMilkyway::mw2oa to oaMilkyway::MilkywayIn for consistency with the other translators.
The translator now better tolerates errors and unexpected conditions in the incoming Milkyway data.
The oa/GNUmakefile now supports a large number of targets to assist in building not just the core oa packages, but oaUtil and all the translators. There are a set of build targets that act on everything (the core oa packages, oaUtil, and the translators).
gmake uninstall, then performs gmake clean everywhere. gmake unitTest to run the package's unitTest. There is another set of targets that you can use to build only a specific package or module. These targets use the four targets above appended with an underscore (_) plus the package name:
Note: Many of the translators require special environment setup for accessing third-party header files and libraries. See Optionally Compiling Translators for details.
verilog2oa translator now retains bus and instance ranges by default. (The -noExpand option has been eliminated.) Files renamed:
- oaVerilogExecption.cpp/.h -> oaVerilogError.cpp/.h
- oaVerilogInCallbacks.cpp/.h -> oaVerilogCallbacksIn.cpp/.h
- oaVerilogInModuleCallbacks.cpp/.h -> oaVerilogModuleCallbacksIn.cpp/.h
- oaVerilogInOptions.cpp/.h -> oaVerilogOptionsIn.cpp/.h
- oaVerilogOutOptions.cpp/.h -> oaVerilogOptionsOut.cpp/.h
- oaVerilogOutCallbacks.cpp/.h -> oaVerilogCallbacksOut.cpp/.h
- oaVliNameList.cpp/h -> oaVerilogNameList.cpp/.h
- oaVliRange.cpp/.h -> oaVerilogRange.cpp/.h
- oaVliValue.cpp/.h -> oaVerilogValue.cpp/.h
Files obsolete:
- oaVerilogGarbageCollector.cpp/.h
- oaVerilogSentinal.cpp/.h
Classes renamed (within in the oaVerilog:: namespace)
- oaVerilogInCallbacks -> CallbacksIn
- oaVerilogInModuleCallbacks -> ModuleCallbacksIn
- oaVerilogOptionsIn -> OptionsIn
- oaVerilogOptionsOut -> OptionsOut
- oaVerilogOutCallbacks -> CallbacksOut
- oaVliNameList -> NameList
- oaVliRange -> Range
- oaVliValue -> Value
The oa2spef executable now depends on the oaUtil project for argument parsing. This dependency is implemented in the oaSpef translator component library. Solutions and Makefiles have been changed to reflect this new dependency
View a summary of the OpenAccess 2.2 a013 changes with respect to 2.2 a012.
View a summary of the OpenAccess 2.2 a013 changes with respect to OpenAccess 2.1.
None.
The OpenAccess installers no longer automatically set required environment variables. For information about setting these variables, see Environment Variables in the Installation and Configuration Notes.
This release includes the OpenAccess to SPEF Translator (oa2spef).
This release includes the Milkyway to OpenAccess Translator (mw2oa). mw2oa translates cells in a Milkyway library to an OpenAccess library. The translator can process all cells and views in a library, or all the cells of one specified view, or all the views of a specified cell, or a single view of a single cell. The translator cannot merge data contained in a Milkyway cell into an OpenAccess design or cellView. Reference library cells are assumed to be in the same library or in a supplied library.
A Milkyway license key is required to run the mw2oa translator.
The supported platforms are listed in the following table.
| Milkyway Translator Supported Platforms |
|---|
| Linux (x86) 32-bit |
| Sun Solaris (Sparc) 32- and 64-bit |
The mw2oa command syntax is:
mw2oa -mwLib library -oaLib library [optional arguments]
You must include the Milkyway source library and the OpenAccess destination library. If a library name does not include a path, the current directory is assumed.
Use the -help or -h argument to display command-line help. The command-line arguments are described in the following table.
Required Arguments |
|
|---|---|
| -mwLib library | Source Milkyway library |
| -oaLib library | Destination OpenAccess library. The translator creates a new OpenAccess library if the specified library does not exist, or it writes into an existing library. You cannot merge the information from a Milkyway cell into an existing OpenAccess cell, but cells can be added to an existing library. If a cell by the same name already exists for a given view, the cell is overwritten. |
| Optional Arguments | |
| [-help | -h] | Prints help |
| [-hierDepth number] | Hierarchical depth to translate to.The defining cells for cell instances are translated only if they are included in the current library. Not currently supported. |
| [-logFile file] | Output log file |
| [-mwCell name] | Milkyway cell name. If specified, only Milkyway cells matching this cell name are translated. |
| [-mwView name] | Milkyway view name. If specified, only Milkyway cells matching this view name are translated. |
| [-techLib library] | Technology library. If specified, the technology database is created in an OpenAccess library specified by this name. Otherwise, the technology database is created in the OpenAccess library that is specified by the -oaLib argument.
The technology file information that is transferred to the OpenAccess technology database consists of:
|
| [-version | -v] | Prints version information |
This section describes how information in a Milkyway database maps to OpenAccess. The mapping is divided into seven sections. Each section shows the Milkyway data and the corresponding OpenAccess object. The function in which the Milkyway data is handled in the standard translator implementation is also included.
Database Units per User Unit
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| DBUperUU | DBUperUU | convertTech() |
Layer Name and Layer Number
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| mwLayerName mwLayerNumber |
oaString oaLayerNum |
convertLayers(), convertLayer() |
Via Definitions
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| contactCode | stdViaDef | convertContactCodes(), convertContactCode() |
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| Library | oaLib | createOAlib() |
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| Cell View ViewType |
oaDesign, oaBlock oaView oaViewType |
convertCell() |
| CellInst | oaScalarInst | convertInsts(), convertInst() |
| CellInstMaster | oaInstHeader | Created automatically |
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| Net | oaScalarNet | convertNets(), convertNet() |
| Port | oaScalarTerm | convertPorts(), convertPort() |
| PortInst | oaInstTerm | convertPortInsts(), convertPortInst() |
| PortInstMaster | private | Created automatically |
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| Pin no points rectangles polygon points array |
oaPin oaDot at 0,0 oaRect oaPolygon oaPointArray |
convertPins(), convertPin() convertPinDot() convertPinRects() convertPinPolygon() convertPoints() |
| Rectangle layer |
oaRect, oaBox oaLayer |
convertRects(), convertRect() |
| Polygon points array layer |
oaPolygon, oaPoints oaPointArray oaLayer |
convertPolygons(), convertPolygon() convertPoints() |
| Text Object layer justification position, rotation, mirror font |
oaText oaLayer oaAlign oaTransform oaFont |
convertTexts(), convertText() |
| Path | oaPath | convertPaths(), convertPath() |
| Boundary | oaAreaBoundary, oaPRBoundary | convertBoundarys(), convertBoundary() |
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| Contact (via) | oaStdVia | convertContacts(), convertContact() |
| WireMaster (idx) horizontal wire vertical wire |
oaSegStyle oaPathSeg oaPathSeg |
convertWireMasters(), convertWireMaster() convertWires(), convertWire() convertWires(), convertWire() |
| Milkyway | OpenAccess | Where Implemented in the Standard Translator |
|---|---|---|
| Property on cell | convertCellProps(), convertProp() | |
| Property on cell obj | convertObjProps(), convertProps() | |
| Group | oaGroup | convertGroups(), convertGroup() |
You can provide a library definition file to oaDMInit using a new, optional command-line argument:
[-libDefFile filePath]
If specified, the -libDefFile command-line argument is handed through argv to the oaDMInit initialization routine, and that file name is used for the library definition file (oaLibDefFile). If specified, this argument overrides the libDefFilePathIn argument to oaDMInit.
oaLibDefFile::setPath() may also be used to specify a different library definition file. Note that OpenAccess does not load library definitions at initialization time or when oaLibDefFile::setPath() is called. Library definitions are loaded when oaLibDefFile::load() is called.
See oaDMTypes.h File Reference for more information about oaDMInit.
ASSIGN statement isn't found, the ASSIGN statement is skipped without error.New: oaBoolean oaLib::isMarkedToBeClosed();
This function indicates whether or not this library is marked as to-be-closed.
A library marked as to-be-closed is not included in the new set of definitions, so is closed as new library definitions are loaded.
Changed: oaBoolean oaLibDefFileCallback::onPreLoad();
This callback indicates that the library definitions are going to be loaded from the library definition file. In your code, check whether the libraries you are using are marked as to-be-closed. If they are, clean up by closing all the existing databases in those libraries. At this point, you can also stop the library definitions from reloading by returning false in this callback.
Visual .NET Program Database Files for the OpenAccess libraries are now included in the Complete installation for the Windows platform. When linking applications against the debug version of the OpenAccess libraries, the Program Database Files enable stepping into the OpenAccess implementation in the debugger.
The Program Database Files contain the full path of the source files in the original hierarchy used to build the OpenAccess libraries. Generally, the path to an installation hierarchy on a user's machine will be different, and in this case, Visual .NET will display the following dialog when first stepping into an OpenAccess function:

Use the dialog to locate the same source file within your installation hierarchy. This only needs to be done once; other source files in the same installation hierarchy are then found automatically.
The following bitwise connectivity features are available:
Important: Code that assumes that there are only single-bit busNets and busTerms to process might not function properly now that busNetBits and busTermBits are explicitly created.
The bitwise connectivity functionality is being made available incrementally in order to allow applications to synchronize their code to the changes. Specifically, the changes are as follows:
The following new features are available:
oaDesignInst Changes
oaLayerMap/oaLayerMapArray
These two utility classes implement an array of mapping layers.
This release includes a new <install_dir>/data directory, which includes platform-independent data files.
A script that automatically updates client source code to reflect changes to the object names in OpenAccess 2.2 is available in under <install_dir>/bin/oa20to22src.
The oa20to22 translator lets you create an OpenAccess 2.2 design library from an OpenAccess 2.0.x design library.
On Windows, make sure that the Cadence cdsCommon DLLs are in your path. (The cdsCommon DLLs are typically included in <install_dir>/tools/bin.) This is not required on the UNIX platforms.
Usage:
oa20to22 -cdsLib path -lib name -path destPath -log file
Required Arguments |
|
|---|---|
| -cdsLib path | cds.lib file that contains the definition of the 2.0 library to translate. |
| -lib name | Name of the source library to translate. |
| -path destPath | Path to which the destination library is written. |
| Optional Arguments | |
| [-libMode mode] |
Name of the library mode, such as for compatibility with the Cadence 5.x library mode. Not currently supported. |
| [-log file] | Name of the log file. The default is oa20to22.log in the current working directory. |
| [-help | -h] | Prints help. |
The following limitations currently apply when converting libraries from 2.0 to 2.2 . These limitations will be removed in a subsequent release.
-libMode option for compatibility with the Cadence 5.X library structure is currently not supported. The following modification occur during the conversion:
View a summary of the OpenAccess 2.2 a012 changes with respect to 2.2 a011.
View a summary of the OpenAccess 2.2 a012 changes with respect to OpenAccess 2.1
Note: The summaries now include information about enums.
This is the first preview release in which the header files reflect the complete OpenAccess API. While the interfaces themselves are fully defined, some functions are not yet implemented. There are two approaches used for portions of the API that are not yet supported:
The documentation for unimplemented functions looks like this:

Note: The Version Control APIs are an exception to the API complete milestone. Other exceptions might surface as the product groups more fully exercise the API.
A script that automatically updates client source code to reflect changes to the object names in OpenAccess 2.2 is available in under <install_dir>/bin/oa20to22src. (The script was previously named UpdateToOA22.)
There are several companion files that contain the rules that oa20to22src uses:
You can run the updater in different modes specified by a command-line option.
********************************************************************************
oa20to22src version 02.20
********************************************************************************
Usage: Updates application source code to reflect changes to class
names and some other aspects of the API in going from
OpenAccess 2.0 to OpenAccess 2.2. Other changes to the API
are not covered by this utility and must be updated manually.
Syntax: oa20to22src
-file fileList Source files to update
[-diff] Show diff of each file without saving changes
[-query] Show diff of each file, prompt whether to save changes
[-silent] Make changes silently in place
[-test] Test changes, saving them in file.oa22 for each file
(This is the default)
[-type
appDefs Update for changes to appDef class names
| enums Update for changes to enum names
| design] Update for changes from oaCellView to oaDesign and
other packaging details
Important: The design type must be used only once on
a given source file, because oaCellView is
used in the OA 2.2 API for a different
purpose.
[-help | -h] Prints help
[-version | -v] Prints version information
The –diff option lets you get a quick feel about what will be changed, while the –test option is useful for doing a graphical diff. The –silent option is useful after confirming that the changes are correct with either –diff or –test.
The script attempts to update class names and variable names in a consistent way, but the changes it makes may not be appropriate for all client code. Because “Design” contains fewer letters than “CellView”, the script will affect the format of the source code. After running the script, you should inspect the modified files and fix any issues introduced by the script.
OpenAccess has extended its connectivity model to better support the connection semantics of Verilog and other netlist formats. You can now connect nets to an instance terminal that is bound to a terminal position in the instance master rather than by a terminal name or reference.
Terminals can be assigned a position number. The terminal APIs in the block, module, and occurrence domains have been updated as follows:
void setPosition(oaUInt4 position);
void unsetPosition();
static oaModTerm *find(const oaModule *module,
oaUInt4 position);
static oaUInt4 getMaxPosition(const oaModule *module);
void getTermsByPosition(oaModTermArray &array) const ;
You can create InstTerms that connect to a terminal position rather than to a terminal name or terminal reference. Binding to a terminal position succeeds if there is a terminal at the specified position and if the number of bits of the connection matches the number of bits in the associated net. The instTerm APIs in the block, module, and occurrence domains have been updated as follows:
static oaModInstTerm *create(oaModNet *net,
oaModInst *inst,
oaUInt4 termPosition);
static oaModInstTerm *find(const oaModInst *inst,
oaUInt4 termPosition);
oaUInt4 getTermPosition() const ;
oaBoolean usesTermPosition() const ;
To avoid confusing the interpretation of the connections established by instTerms, OpenAccess adds a restriction that all of the instTerms associated with a particular instance must be connected by name/reference or be connected by position. An exception is thrown if you try to create an instTerm by position on an instance in which the existing instTerms connect by name. Likewise, an exception is thrown if you try to create an instTerm by name on an instance in which the existing instTerms connect by position. A new method has been added to instances that lets you query how an instance is connected. For example, on oaModInst, there is the following method:
oaBoolean usesTermPositions() const ;
This function returns false if the instance has no associated instTerms.
There are changes in behavior for some of the methods on instTerms.
oaRoute objects have a new purpose attribute that indicates the intended use of the route and is not related to technology purposes. Two new APIs, getPurpose() and setPurpose(), let you query and modify this attribute. By default, every new route has a generic type, which an application can override with a different purpose. All available purposes are contained in a new oaRoutePurposeEnum enumeration that is facilitated by the oaRoutePurpose class.
Refer to the documentation for the oaRoute and oaRoutePurpose classes for more details.
oaLayerHeader objects now bind to the technology oaLayer objects for the layers they represent. Two new APIs, isBound() and getLayer(), are available for public use. You can now get the technology oaLayer object directly from the oaLayerHeader object. getLayer() always makes an attempt to bind the layerHeader if it is unbound and returns NULL on failure.
Refer to the documentation of oaLayerHeader class for more details.
oaLPPHeader objects now bind to the technology oaLayer and oaPurpose objects for the layer-purpose pairs they represent. An oaLPPHeader object is considered bound only if both the layer and purpose bindings are successful. Three new APIs, isBound(), getLayer() and getPurpose(), are available for public use. You can now get the technology oaLayer and oaPurpose objects directly from the oaLPPHeader object. Both getLayer() and getPurpose attempt to bind the LPPHeader if it is unbound and return NULL if the bindings for both layer and purpose cannot be made.
Refer to the documentation of the oaLPPHeader class for more details.
oaLPPHeader objects now verify that an oaLayerHeader object exists for the layer in the layer-purpose pair they represent. Thus, the creation of a new oaLPPHeader object might trigger the creation of a new oaLayerHeader object in the design hierarchy, and these two objects continue to propagate in the hierarchy as before (relevant for region query). The collection of oaLayerHeaders for an oaBlock now represents all the layers in use by different objects (that have layer association) in the design hierarchy below and including the block.
A new API in the oaLayerHeader class lets a client access the collection of oaLPPHeader objects associated with the oaLayerHeader. A new API in the oaLPPHeader class allows a client to query the oaLayerHeader object for the oaLPPHeader object being queried. Note that an oaLayerHeader object cannot have any oaLPPHeaders objects associated with it while an oaLPPHeader object will always have an oaLayerHeader object associated with it.
Refer to the documentation of the oaLayerHeader and oaLPPHeader classes for more details.
The following class names have changed:
Also, the database extension classes are now managed objects. You can no longer create AppDef objects by calling the constructor. For example, instead of creating a new oaIntAppDef, use the oaIntAppDef::get() method to obtain a pointer to the AppDef.
Dynamic binding of instance headers is now supported.
Note: Dynamic binding of via headers is not yet supported.
With Embedded Module Hierarchy, assignments in the module domain will now result in equivalent nets in the block domain, and layout tools need to handle this in order to properly implement the logic functionality. The layout information for all of the nets in an equivalent set should be stored on the preferred equivalent.
The oaInstTerm::getNet() and oaTerm::getNet() methods now take an optional argument to specify that the preferred equivalent net should be returned instead of the directly connected net. In addition, the oaNet::getInstTerms() and oaNet::getTerms() methods now take a filterFlags argument to specify that the collection should include all of the instTerms or terms connected to any of the nets in an equivalent set, in addition to the ones on the directly connected net.
The C++ namespaces for the translators have changed.
View a summary of the OpenAccess 2.2 a011 changes with respect to 2.2 a010.
View a summary of the OpenAccess 2.2 a011 changes with respect to OpenAccess 2.1.
oaViewTypes are now implemented as oaSessionObjects instead of enumerated types, which allows users to define their own persistent viewTypes.
An oaViewType is an object with a single attribute, a string name. oaViewTypes can be created and found.
The oaReservedViewType utility class is an enumerated type wrapper that defines the OpenAccess reserved viewTypes:
The reserved viewTypes are always predefined and available as oaViewTypes. The static oaViewType::get(oaReservedViewType) method allows fast and easy access to the reserved viewTypes.
// *****************************************************************************
// oaViewType
// *****************************************************************************
class OA_DM_DLL_API oaViewType : public oaSessionObject {
public:
static oaViewType *create(const oaString &name);
static oaViewType *find(const oaString &name);
static oaViewType *get(oaReservedViewType type);
void getName(oaString &name) const;
static oaCollection<oaViewType, oaSession> getViewTypes();
};
The collection of session viewTypes is the union of all reserved viewTypes, all viewTypes defined by users in the course of the session, and all user-defined viewTypes used in libraries that were opened during the session. ViewTypes are not destroyed.
The following API has also changed:
static oaDesign *open(const oaScalarName &libNameIn,
const oaScalarName &cellNameIn,
const oaScalarName &viewNameIn,
const oaViewType *viewType,
oaChar mode);
When opening a cellView, viewTypes are still restricted to the set of reserved design viewTypes:
You can use the oaViewType::get(oaReservedViewType) API to construct the viewType objects to pass into the oaDesign::open() API.
In addition, all APIs for user units and database units on the Tech class now take an oaViewType pointer. These viewTypes are also restricted to the set of reserved viewTypes for design.
When you provide the -Z option on the command line, OpenAccess forces the loading of the built-in region query plug-in rather than other available plug-ins. In previous releases, the -Z option functioned differently and did not load the built-in region query plug-in.
When equivalent nets are created in the module domain, corresponding equivalences are now created properly in the occurrence and block domains.
Some of the array utility classes, such as oaRouteObjectArray, have been consolidated to be derived from a template base class, oaArray<T>. Also, three new arrays have been introduced based on the template class:
Clients might need to make minor modifications to their code to make use of the methods of the oaArray<T> template class. Clients might need to replace getNumObjects() with getNumElements(), and setNumObjects() with setNumElements(). The subscript operators will continue to function as before
In OpenAccess 2.0, oaLayerHeader objects were associated with oaBlockage and route segments. For the early phase of OpenAccess 2.2, oaLayerHeader objects were removed from the hierarchy because all the route objects became managed objects and blockages were moved to be associated with oaLPPHeaders with a fixed purpose. oaLayerHeader objects have been reintroduced in the hierarchy to support the association of guides, Steiners, blockages, and rules to layers without associated technology purposes.
Please refer to the documentation for oaLayerHeader for more details.
oaBlockage objects now relate to oaLayerHeader objects. The oaBlockage object interface lets clients query the layerHeader from the blockage. Note that placement-type blockages do not have a layer associated with them and are not related to layerHeaders. The oaLayerHeader interface provides the merged bBox of all blockages on that layer and the collection of blockages on that layer.
Please refer to the documentation for oaBlockage and oaLayerHeader for more details.
Guides have an optional start and end layer and have been updated to relate to oaLayerHeader objects. Guide objects now provide an interface for clients to query the layerHeaders for the start and end layers. oaLayerHeader now provides an interface for clients to access all guides that start on a specific layer, end on a specific layer, or the unique set of guides that either start or end on a specific layer. The oaLayerHeader interface has also been updated to provide the merged bBox of all the guides that start or end on a specific layer.
Refer to the documentation for oaSteiner, oaNet, and oaLayerHeader for more details.
The public oaViaParam cut pattern interface has been updated to make it more safe. The oaViaParam object will no longer allow an application to specify a cut pattern that was encoded by the application and might be different than the encoding used by OpenAccess. The encoding is handled internally. Allocating a cut pattern whose size might not match the cut matrix is also no longer permitted.
The following unsafe methods have been removed from the public interface:
oaByte *getCutPattern() const; void setCutPattern(oaByte *cutPattern); oaUInt4 getCutPatternSize() const; void setCutPatternSize(oaUInt4 size); void allocCutPattern(oaUInt4 size); void allocCutPattern(oaUInt4 numCutRows, oaUInt4 numCutCols); void freeCutPattern();
Two new methods have been added to the cut pattern interface:
oaBoolean hasDefaultCutPattern() const;
void setDefaultCutPattern();
Clients can now directly use setCutPatternVal() to customize the cutPattern and use getCutPatternVal() to retrieve the customized cutPattern. hasDefaultCutPattern() returns FALSE for a customized cutPattern and TRUE for the default cutPattern, which assumes that all cuts exist. A customized cutPattern can be reset to the default by using setDefaultCutPattern().
The row and column bounds for getCutPatternVal() and setCutPatternVal() are determined by the values that the client sets with setCutRows() and setCutColumns(), which are 1 by default. Also, a change to either the number of cut rows or cut columns after the cut pattern has been customized results in resetting the cutPattern to the default cut pattern.
Refer to the oaViaParam documentation for more details.
View a summary of the OpenAccess 2.2 a010 changes with respect to 2.2 a009.
View a summary of the OpenAccess 2.2 a010 changes with respect to OpenAccess 2.1.
This release includes the following:
oaUInt8 oaDesign::calcVMSize() const;
oaUInt8 oaTech::calcVMSize() const;
oaUInt8 oaWafer::calcVMSize() const;
oaUInt8 oaLib::calcVMSize() const;Queries are supported for:
Updates are supported for:
The oaRouteObjArray class has been renamed to oaRouteObjectArray. Also, two of its methods – getNumObjs() and setNumObjs() – have been renamed to getNumObjects() and setNumObjects() respectively. See oaRouteObjectArray for more information.
Two new methods have been added:
See oaRoute for more information.
oaVia objects have been enhanced to form a logical binding with oaRoute objects when they become part of a route. If the via belonged to a net, it is removed from the net and the route's net applies to the via. If the via is removed from the route, it acquires the route's net. If a via that is part of a route is destroyed, the route is updated to remove the via from it first. An exception is thrown if an attempt is made to add or remove a via from a net if the via belongs to a route. The interface methods, hasRoute(), getRoute(), hasNet(), and getNet(), are now available.
See oaVia for more information.
oaPathSeg objects have been enhanced to form a logical binding with oaRoute objects when they become part of a route. If the pathSeg belonged to a net, it is removed from the net and the route's net applies to the pathSeg. If the pathSeg is removed from the route, it acquires the route's net. If a pathSeg that is part of a route is destroyed, the route is updated to remove the pathSeg from it first. An exception is thrown if an attempt is made to add or remove a pathSeg from a net if the pathSeg belongs to a route. The interface methods, hasRoute(), getRoute(), hasNet(), and getNet(), are now available.
See oaPathSeg for more information.
To work effectively with route and pin figures, the collection of guides, vias and shapes available off a net can now be customized based on application needs. The getShapes(), getVias(), and getGuides() methods on oaNet now take an additional parameter that customizes their behavior.
The updated oaNet interface for accessing these collection is as follows:
oaCollection<oaShape, oaNet> getShapes(oaUInt4 filterFlags = oacShapeIterNetRoutes);oaCollection<oaVia, oaNet> getVias(oaUInt4 filterFlags = oacViaIterNetRoutes);oaCollection<oaGuide, oaNet> getGuides(oaBoolean includeRouteGuides = true);Refer to oaNet for more information.
There are two new classes under oaFig:
The remaining figures (which are not pin figures or connectivity figures) are directly derived from oaFig. These are oaBoundary, oaMarker, and so forth.
An oaPin is now created without a figure. Figures need to be added to an oaPin using the oaPinFig::addToPin API. This allows for multiple figures on a pin. Removing pin figures is done using oaPinFig::removeFromPin. Importantly, the hasPin/getPin API no longer exists on oaFig. It is now on oaPinFig. This means all existing code accessing pin figures must be changed.
The API for adding/removing connectivity figures from nets is now on oaConnFig instead of on the separate classes.
In OpenAccess 2.1, modules are named like cellViews, using a lib/cell/view triplet with an optional variant name. The intent was to facilitate tracking of uniquified variants derived from an original module, particularly when the variants are moved from one library to another using oaModule::embed() or oaModule::detach(). However, when EMH, there are cases in which the lib/cell/view/variant naming approach is not robust enough to properly track the variants.
The lib/cell/view approach also implies a relationship to the library data model that does not really exist, which allowed a number of inconsistencies in the data model. In OpenAccess 2.1, you can create a module named libX/cellY/viewZ in a cellView named libA/cellB/viewC. The library portion of the module's name (libX) did not have to correspond to any real library in the design, and in fact the module is defined within libA, not within libX. Similarly, the cell portion of the module's name (cellY) does not have to correspond to any real cell in the design; the module is actually defined in cellB, not in cellY. Even if there is a cellY in libA, the module would not have to have any relationship to that cell.
A third set of issues arises from the fact that the modules in EMH are often created from Verilog. In a Verilog netlist, modules have a single name, so a Verilog translator that creates an OpenAccess database must make up a lib/cell/view triplet for each oaModule. In OA 2.1, a convention of setting the cell name to the Verilog module name, and the lib name and view name to be same as the containing cellView was used, but that convention is awkward as oaModules are moved from one cellView to another with embed and detach.
OpenAccess 2.2 uses a single name for modules, like other objects contained within an oaDesign. Tracking variants is still possible, but the only information kept is the original module from which a variant was derived. All variants derived from the same module have an origName attribute set to the name of the original module. When a variant is created through oaOccurrence::uniquify(), applications can specify the new module name to be used for the variant, or allow the database to choose a name automatically.
Related methods have been modified on the following classes:
You can translate information from the OpenAccess database to Verilog using the oa2verilog command-line executable.
| UNIX | Windows |
| oa2verilog | oa2verilog.exe |
To export OpenAccess data to Verilog
Enter:
oa2verilog -lib library -cell cell -view view
The oa2verilog command traverses all the modules in the input library, cell, and view and produces a Verilog netlist for each module. By default, the netlist is written to a file named after the input cell name in the current working directory.
The following section describes the arguments for oa2verilog. Optional arguments are shown in square brackets.
-lib library
-cell cell
-view view
[-global modName]
[-help | -h]
[-output file]
[-recursive]
[-tieLow net]
[-tieHigh net]
[-version | -v]
[-leafFile fileName]
lib library
Specifies the input library name.
cell cell
Specifies the input cell name.
view view
Specifies the input view name.
global modName
Specifies the name of the module in which to define global nets, if any exist.
The default isglobals.help
hPrints the command summary.
output file
Specifies the name of the Verilog file to create. You can provide a file name or a file/path name.
The default is the name of the cell with a.vextension.recursive
Writes out all oaDesigns in the hierarchy that are in the same directory and have the same top view name as the top-level design.
By default, only the top module is translated.tieLow net
Specifies the name of the tie low net. Nets that are equivalent to the tie low net produce assign statements to
1'b0. Instances whose instTerms are tied to one of these nets produce module instantiations with1'b0as the connecting net in the list of port connections. If a bus is tied to a bundle that is comprised of the tie low and tie high nets, the connection will be to a constant of the form'b10001010011101...where bundle members of the tie low net become zeros and bundle members of the tie high net become ones. For example, if net"tie0,2*tie1,tie0"is connected to terminal"a[3:0]"of instance"I1", the module instantiation in the output Verilog file is"I1(.a('b0110)…)"
The default tie low net name is tie0.tieHigh net
Specifies the name of the tie high net. Nets that are equivalent to the tie high net produce assign statements to
1'b1. Instances whose instTerms are tied to one of these nets produce module instantiations with1'b1as the connecting net in the list of port connections. If a bus is tied to a bundle that is comprised of the tie low and tie high nets, the connection will be to a constant of the form'b10001010011101...where bundle members of the tie low net become zeros and bundle members of the tie high net become ones. See tieLow net above for an example.
The default is tie1.version
vPrints out the version information.
leafFile fileName
By default, Verilog module definitions for leaf cells (stubs) are written to the file specified with the
outputoption. If you supply theleafFileoption, the stub module definitions are written to the given file name instead.
The oaSession class implements a session database, which is a non-persistent database used as a parent for session-wide information.
The oaSession database is a VM-only database that serves as a parent to session objects. Session objects are transient objects that are valid for the entire OpenAccess session. The session db is automatically created and maintained as needed by the OpenAccess implementation. There is only one session database per OpenAccess session.
Session objects may have a persistent representation. In some cases, the session objects represent information that is a superset of information compiled from the databases that are opened in the OpenAccess session. An example of a session object is the oaLibDef object.
It is not legal to create properties or appDefs on session objects, nor is it legal to add these objects to groups. (Note that this restriction is not yet implemented.)
oaLibDefs are now implemented as session objects. Previously, libDefs were implemented as static methods on the oaLib object. This means that all code that uses libDefs must be modified to use the oaLibDef object.
You can find, create, and destroy oaLibDefs just like any other oaObject. Because they are oaSessionObjects, oaLibDef objects are valid for the entire OpenAccess session.
Creating an oaLibDef object requires a library name and a library path. Additional information needed for initializing the library is added through attributes on the oaLibDef. Each oaLibDef may have 0 or more attributes. An attribute is a string name/string value pair. If the attribute value is not naturally a string, then the value is interpreted by the user, which is typically the design management (DM) plug-in.
In the reference implementation, there are three supported attributes:
// This code adds a new library definition if it does not already exist.
oaScalarName libName(oaUnixNS(), "myLibName");
oaString libPath("myLibPath);
if (!oaLibDef::find(libName)) {
oaLibDef *libDef = oaLibDef::create(libName, libPath);
libDef->addAttribute("serverLogFileName", "./testServer.slog");
}
View a summary of the OpenAccess 2.2 a009 changes with respect to 2.2 a008.
View a summary of the OpenAccess 2.2 a009 changes with respect to OpenAccess 2.1.
Starting with the a008 release, all OpenAccess classes and types will be declared in the OpenAccess_4 namespace, where 4 stands for the major API revision number for OpenAccess 2.2. The full namespace, OpenAccess_4, will be aliased to oa, and this is what the application should reference.
namespace OpenAccess_4 {
// Declarations for all public API classes and functions
}
namespace oa = OpenAccess_4;
The oa alias provides two benefits:
Applications can promote the oa namespace to the global namespace, which is recommended:
#include "oaDesignDB.h"
using namespace oa;
Or, applications can choose to fully qualify classes and types in the oa namespace.
This release includes the following:
The oaRoute::isWellFormed() method has been replaced by oaRoute::isContiguous (), which has similar semantics.
In previous releases, oaGuide was a standalone object that could not be added to a route. oaGuide has been redefined with a different interface, and the new version can be added to a route. When an oaGuide is added to a route, an association is formed between the route and the guide. If the guide belonged to a net, it is first removed from the net, and then the route's net applies to the guide.
When a guide is part of a route, trying to add the guide to a net or remove it from a net will throw an exception. If the guide is removed from the route, it will acquire the route's net. If a guide that belongs to a route is destroyed, it is automatically removed from the route.
Three new methods, hasRoute(), getRoute(), and hasNet() are available. Also, the getNet() method has been updated . See the oaGuide API documentation for more information.
View a summary of the OpenAccess 2.2 a008 changes with respect to 2.2 a007.
View a summary of the OpenAccess 2.2 a008 changes with respect to OpenAccess 2.1.
Release date: 3/19/2004
Note: The LEF and DEF translators now depend on the lefdefInt05.60-d005 kit from CAT (as opposed to lefdefInt05.51-s002). This does not mean that LEF/DEF 5.6 is supported.
A delay attribute has been added to the oaPoleResidue object to represent the Elmore delay from a particular driver to a receiver (in addition to the existing set of poles and residues).
The oaPoleResidue object is for use with moment-based approaches for using poles and residues to approximate the transfer function for propagating across the parasitic network. These approaches do not use the Elmore delay. However, the Standard Parasitic Exchange Format (SPEF) syntax requires that an Elmore delay be specified along with the poles and residues. Including the Elmore delay as part of the oaPoleResidue enables lossless round trips between OpenAccess and SPEF, and it ensures that oaPoleResidues created by other applications can be written out properly to SPEF.
In the oaPoleResidue API, three changes will support the Elmore delay, as shown below. These changes include an additional constructor argument and two new methods to set and get the delay.
// *****************************************************************************
// oaPoleResidue
// *****************************************************************************
class OA_DESIGN_DLL_API oaPoleResidue : public oaDesignObject {
public:
static oaPoleResidue *create(oaPiPoleResidue *model,
oaDesignObject *receiver,
oaFloat delay,
const oaComplexArray<oaFloat> &poles,
const oaComplexArray<oaFloat> &residues);
static oaPoleResidue *find(const oaPiPoleResidue *model,
const oaDesignObject *receiver);
void destroy();
void setDelay(oaFloat delay);
void setPoles(const oaComplexArray<oaFloat> &poles);
void setResidues(const oaComplexArray<oaFloat> &res);
oaFloat getDelay() const;
void getPoles(oaComplexArray<oaFloat> &poles) const;
void getResidues(oaComplexArray<oaFloat> &res) const;
oaDesignObject *getReceiver() const;
oaPiPoleResidue *getPiPoleResidue() const;
enum {dtIndex = oacPoleResidueDataType};
enum {domain = oacNoDomain};
};
OpenAccess now supports a technology level value (default value) for the manufacturing grid (not the routing grid):
This release includes the following:
View a summary of the OpenAccess 2.2 a007 changes with respect to 2.2 a006.
View a summary of the OpenAccess 2.2 a007 changes with respect to OpenAccess 2.1.
Release date: 3/3/2004
oaDesign::bindSuperMaster() has been removed. If there are changes to the code and pCell parameters associated with an existing superMaster, call oaDesign::defineSuperMaster() to redefine that superMaster. The redefinition of a superMaster binds it to the new code and pCell parameter set.
The simplification of the oaGuide object has a significant impact on its API.
The following APIs now take oaDouble instead of oaFloat for the scale and angle arguments.
void oaPoint::transform(oaDouble scale,
oaDouble angle,
oaPointArray &result) const;
void oaPoint::transform(oaDouble scale,
oaDouble angle);
void oaBox::transform(oaDouble scale,
oaDouble angle,
oaPointArray &result) const;
void oaBox::transform(oaDouble scale,
oaDouble angle);
void oaShape::transform(oaDouble scale,
oaDouble angle);
void oaMarker::transform(oaDouble scale,
oaDouble angle);
void oaBoundary::transform(oaDouble scale,
oaDouble angle);
void oaBlockage::transform(oaDouble scale,
oaDouble angle);
void oaPointArray::transform(oaDouble scale,
oaDouble angle,
oaPointArray &result) const;
void oaPointArray::transform(oaDouble scale,
oaDouble angle);
View a summary of the OpenAccess 2.2 a006 changes with respect to 2.2 a005.
View a summary of the OpenAccess 2.2 a006 changes with respect to OpenAccess 2.1.
Release date: 02/20/2004
The verilog2oa command-line executable lets you translate Verilog data into the OpenAccess database format.
For more information, see verilog2oa.
There are some significant improvements to capacity for routes.
The oaReticle database has been renamed to oaWafer.
This project extends the OpenAccess data model to include new objects that represent unique occurrences of shapes in a design hierarchy. These new oaOccShape objects do not represent new data; they are simply an alternate way of viewing existing data objects. The prototype for the oaOccShape is shown below.
// *****************************************************************************
// oaOccShape
// *****************************************************************************
class OA_DESIGN_DLL_API oaOccShape {
public:
oaShape *getShape() const;
void getBBox(oaBox &bBox) const;
void getHierPath(oaHierPath &hierPath) const;
oaLPPHeader *getHeader() const;
oaLayerNum getLayerNum() const;
oaPurposeNum getPurposeNum() const;
oaNet *getNet();
oaRouteStatus getRouteStatus() const;
oaBoolean hasPin() const;
oaPin *getPin();
oaBoolean hasNet() const;
enum {dtIndex = oacShapeDataType};
};
The oaOccShape class is similar to the oaShape class, but there are a few significant differences:
Each type of shape will have a matching occurrence equivalent. For example, oaPath will have a corresponding oaOccPath :
// *****************************************************************************
// oaOccPath
// *****************************************************************************
class OA_DESIGN_DLL_API oaOccPath : public oaOccShape {
public:
oaUInt4 getWidth() const;
oaUInt4 getNumPoints() const;
void getPoints(oaPointArray &points) const;
oaPathStyle getStyle() const;
oaUInt4 getBeginExt() const;
oaUInt4 getEndExt() const;
void getBoundary(oaPointArray &boundary) const;
oaBoolean isOrthogonal() const;
static void genBoundary( const oaPointArray &points,
oaUInt4 width,
oaPathStyle style,
oaUInt4 beginExt,
oaUInt4 endExt,
oaPointArray &boundary);
};
Again note that the oaOccPath object has a read-only interface. Also, the path centerline and boundary point arrays will be returned within the coordinate frame of the specific path occurrence.
The oaOccShape classes are not “first-class” objects in the OpenAccess data model. This means occShapes are not saved persistently, cannot have properties attached to them, and cannot be assigned to groups.
You can use the oaShapeQuery::getOccShape() method to get oaShapes. When querying a region of a design hierarchy, applications can ask for occShapes that intersect the region. This is a significant convenience because the occShape encapsulates all the information about the shape in its context in the design hierarchy.
occShapes are dynamically generated. This keeps the virtual memory size as small as possible. A specific occShape is not created until an application requests it.
Applications are responsible for freeing the resources associated with each occShape by calling the oaOccShape::release() method.
See the oaOccShape.h file for details.
New API:
oaShapeQuery::getOccShape(oaShape *shape) constconst
oaHierPath::setSize(oaUInt4 newSize)
oaHierPath::setLevel(oaUInt4 depth,
oaRef *ref,
oaUInt4 row,
oaUInt4 column) ;
Changed API:
const oaHierPath& oaRegionQuery::getHierPath() const
Is changed to:
void oaRegionQuery::getHierPath(oaHierPath &hierPath) const
OpenAccess 2.0 and 2.1support several different naming schemes for the public enumerated integral constant identifiers exposed to their clients. Most of these public identifiers follow a suffix style naming scheme such as the following:
enum oaRouteStatusEnum {
oacNormalRouteStatus = 0,
oacFixedRouteStatus = 1,
oacLockedRouteStatus = 2
};
The enumeration identifier oaRouteStatusEnum has an ‘oa' prefix and an ‘Enum' suffix and embeds the actual data domain representation (RouteStatus) in between.
The enum-list of identifiers representing integer constants always have the ‘oac' prefix indicating an OA constant followed by a name indicating the datum it represents, and finally being suffixed by the higher level data type representation from the enumeration identifier. Thus, the naming scheme for the fixed type of route status would imply the concatenation of the following oac -Fixed- RouteStatus to form the actual identifier name oac Fixed RouteStatus.
OpenAccess 2.2 will follow and enforce a strict suffix style policy for enumerated identifiers as described above. The goal is to keep these identifiers consistent, predictable, and readable to the OpenAccess community. The suffix style for enumerated identifiers provides good readability (for left-to-right read languages) as the primary user information is available immediately after the ‘ oac ' prefix.
Enforcing this policy requires that OpenAccess 2.2 redefine the minority of enumerated identifiers that do not follow this policy. A few special cases are allowed as exceptions, including identifiers for exception handling, orientations, view types, and user units.
See Supplementary Information for the list of affected enumerations and their new OpenAccess 2.2 substitutions.
As the execution of this project involves redefining the names for a number of identifiers, the resulting incompatibility requires that all OpenAccess 2.0 and 2.1 clients update their source code to use properly redefined identifier names. The impact of this compatibility issue will be mitigated by providing an automated script that substitutes all affected enumerated identifiers with the correct ones. This script will be bundled with OpenAccess 2.2.
There will be no performance impact as this project involves a simple substitution of identifier names.
The following list of enumerations will be redefined in OpenAccess 2.2. Both the old and new representations are shown.
oaDBTypeEnum
Old Representation enum oaDBTypeEnum { oacDBTypeBase = UINT_MAX, oacDBTypeDesign = 0, oacDBTypeTech = 1, oacDBTypeLib = 2, oacWaferDBType = 4 }; New Representation enum oaDBTypeEnum { oacBaseDBType = UINT_MAX, oacDesignDBType = 0, oacTechDBType = 1, oacLibDBType = 2, oacWaferDBType = 4 };
oaDirIterModeEnum
Old Representation
enum oaDirIterModeEnum {
oacDirIterModeFiles = 0,
oacDirIterModeDirs = 1,
oacDirIterModeAll = 2
};
New Representation
enum oaDirIterModeEnum {
oacFilesDirIterMode = 0,
oacDirsDirIterMode = 1,
oacAllDirIterMode = 2
};
oaAssignmentAttrTypeEnum
Old Representation
enum oaAssignmentAttrTypeEnum {
oacAssignmentAttrName = 0
};
New Representation
enum oaAssignmentAttrTypeEnum {
oacNameAssignmentAttrType = 0
};
oaSymmetryEnum
Old Representation
enum oaSymmetryEnum {
oacSymmetryNone = 0,
oacSymmetryX = 1,
oacSymmetryY = 2,
oacSymmetryXY = 3,
oacSymmetryAny = 4
};
New Representation
enum oaSymmetryEnum {
oacNoSymmetry = 0,
oacXSymmetry = 1,
oacYSymmetry = 2,
oacXYSymmetry = 3,
oacAnySymmetry = 4
};
oaRowSpacingTypeEnum
Old Representation
enum oaRowSpacingTypeEnum {
oacRowSpacingTypeEvery = 0,
oacRowSpacingTypeEven = 1,
oacRowSpacingTypeOdd = 2
};
New Representation
enum oaRowSpacingTypeEnum {
oacEveryRowSpacingType = 0,
oacEvenRowSpacingType = 1,
oacOddRowSpacingType = 2
};
oaRowFlipTypeEnum
Old Representation
enum oaRowFlipTypeEnum {
oacRowFlipTypeNone = 0,
oacRowFlipTypeEven = 1,
oacRowFlipTypeOdd = 2
};
New Representation
enum oaRowFlipTypeEnum {
oacNoRowFlipType = 0,
oacEvenRowFlipType = 1,
oacOddRowFlipType = 2
};
oaDesignAttrTypeEnum
Old Representation
enum oaDesignAttrTypeEnum {
oacDesignAttrLibName = 0,
oacDesignAttrCellName = 1,
oacDesignAttrViewName = 2,
oacDesignAttrCellType = 3,
oacDesignAttrLastSavedTime = 4
};
New Representation
enum oaDesignAttrTypeEnum {
oacLibNameDesignAttrType = 0,
oacCellNameDesignAttrType = 1,
oacViewNameDesignAttrType = 2,
oacCellTypeDesignAttrType = 3,
oacLastSavedTimeDesignAttrType = 4
};
oaCellTypeEnum
Old Representation
enum oaCellTypeEnum {
oacCellTypeNone = 0,
oacCellTypeBlock = 1,
oacCellTypeBlockRing = 2,
oacCellTypeCover = 3,
oacCellTypeCoverBump = 4,
oacCellTypePad = 5,
oacCellTypePadSpacer = 6,
oacCellTypeCore = 7,
oacCellTypeCoreSpacer = 8,
oacCellTypeCoreAntenna = 9,
oacCellTypeCorner = 10,
oacCellTypeSoftMacro = 11,
oacCellTypeVia = 12,
oacCellTypeBlockBlackBox = 13,
oacCellTypePadAreaIO = 14
};
New Representation
enum oaCellTypeEnum {
oacNoCellType = 0,
oacBlockCellType = 1,
oacBlockRingCellType = 2,
oacCoverCellType = 3,
oacCoverBumpCellType = 4,
oacPadCellType = 5,
oacPadSpacerCellType = 6,
oacCoreCellType = 7,
oacCoreSpacerCellType = 8,
oacCoreAntennaCellType = 9,
oacCornerCellType = 10,
oacSoftMacroCellType = 11,
oacViaCellType = 12,
oacBlockBlackBoxCellType = 13,
oacPadAreaIOCellType = 14
};
oaDesignCollTypeEnum
Old Representation
enum oaDesignCollTypeEnum {
oaBaseDesignCollType = 0,
oaSubMasterDesignCollType = 1
};
New Representation
enum oaDesignCollTypeEnum {
oacBaseDesignCollType = 0,
oacSubMasterDesignCollType = 1
};
oaTermModTypeEnum
Old Representation
enum oaTermModTypeEnum {
oacSetImplicitTermModType = 2,
oacSetTermTypeTermModType = 3,
oacMoveToNetTermModType = 4,
oacSetAntennaDataModType = 5,
oacUnsetAntennaDataModType = 6,
oacSetPinConnectMethodTermModType = 7,
oacScalarTermSetNameTermModType = 10,
oacBusTermSetBaseNameTermModType = 20,
oacBusTermSetRangeTermModType = 21,
oacSetRouteMethodTermModType = 22
};
New Representation
enum oaTermModTypeEnum {
oacSetImplicitTermModType = 2,
oacSetTermTypeTermModType = 3,
oacMoveToNetTermModType = 4,
oacSetAntennaDataTermModType = 5,
oacUnsetAntennaDataTermModType = 6,
oacSetPinConnectMethodTermModType = 7,
oacScalarTermSetNameTermModType = 10,
oacBusTermSetBaseNameTermModType = 20,
oacBusTermSetRangeTermModType = 21,
oacSetRouteMethodTermModType = 22
};
oaInstAttrTypeEnum
Old Representation
enum oaInstAttrTypeEnum {
oacInstAttrLibName = 0,
oacInstAttrCellName = 1,
oacInstAttrViewName = 2,
oacInstAttrName = 3,
oacInstAttrOrigin = 4,
oacInstAttrOrient = 5,
oacInstAttrTransform = 6,
oacInstAttrParams = 7,
oacInstAttrNumBits = 8,
oacInstAttrIsBound = 9
};
New Representation
enum oaInstAttrTypeEnum {
oacLibNameInstAttrType = 0,
oacCellNameInstAttrType = 1,
oacViewNameInstAttrType = 2,
oacNameInstAttrType = 3,
oacOriginInstAttrType = 4,
oacOrientInstAttrType = 5,
oacTransformInstAttrType = 6,
oacParamsInstAttrType = 7,
oacNumBitsInstAttrType = 8,
oacIsBoundInstAttrType = 9
};
oaInstTermAttrTypeEnum
Old Representation
enum oaInstTermAttrTypeEnum {
oacInstTermAttrName = 0
};
New Representation
enum oaInstTermAttrTypeEnum {
oacNameInstTermAttrType = 0
};
oaMarkerSeverityEnum
Old Representation
enum oaMarkerSeverityEnum {
oacSeverityAnnotation = 0,
oacSeverityInfo = 1,
oacSeverityAcknowledgedWarning = 2,
oacSeverityWarning = 3,
oacSeveritySignedOffError = 4,
oacSeverityError = 5,
oacSeveritySignedOffCriticalError = 6,
oacSeverityCriticalError = 7,
oacSeverityFatalError = 8
};
New Representation
enum oaMarkerSeverityEnum {
oacAnnotationMarkerSeverity = 0,
oacInfoMarkerSeverity = 1,
oacAcknowledgedWarningMarkerSeverity = 2,
oacWarningMarkerSeverity = 3,
oacSignedOffErrorMarkerSeverity = 4,
oacErrorMarkerSeverity = 5,
oacSignedOffCriticalErrorMarkerSeverity = 6,
oacCriticalErrorMarkerSeverity = 7,
oacFatalErrorMarkerSeverity = 8
};
oaDetachVisibilityEnum
Old Representation
enum oaDetachVisibilityEnum {
oacDetachInheritFromSourceModule = 0,
oacDetachVisibleToBlockDomain = 1,
oacDetachExcludeFromBlockDomain = 2
};
New Representation
enum oaDetachVisibilityEnum {
oacInheritFromSourceModuleDetachVisibility = 0,
oacVisibleToBlockDomainDetachVisibility = 1,
oacExcludeFromBlockDomainDetachVisibility = 2
};
oaNetAttrTypeEnum
Old Representation
enum oaNetAttrTypeEnum {
oacNetAttrName = 0,
oacNetAttrSigType = 1,
oacNetAttrIsGlobal = 2,
oacNetAttrIsImplicit = 3,
oacNetAttrIsEmpty = 4,
oacNetAttrNumBits = 5
};
New Representation
enum oaNetAttrTypeEnum {
oacNameNetAttrType = 0,
oacSigTypeNetAttrType = 1,
oacIsGlobalNetAttrType = 2,
oacIsImplicitNetAttrType = 3,
oacIsEmptyNetAttrType = 4,
oacNumBitsNetAttrType = 5
};
oaConnStatusEnum
Old Representation
enum oaConnStatusEnum {
oacConnStatusDefault = 0,
oacConnStatusFirm = 1,
oacConnStatusLocked = 2
};
New Representation
enum oaConnStatusEnum {
oacNormalConnStatus = 0,
oacFixedConnStatus = 1,
oacLockedConnStatus = 2
};
oaScanChainSetTypeEnum
Old Representation
enum oaScanChainSetTypeEnum {
oacOrderedSetType = 0,
oacUnorderedSetType = 1
};
New Representation
enum oaScanChainSetTypeEnum {
oacOrderedScanChainSetType = 0,
oacUnorderedScanChainSetType = 1
};
oaPinConnectMethodEnum
Old Representation
enum oaPinConnectMethodEnum {
oacPinConnectMethodDefault = 0,
oacPinConnectMethodRing = 1,
oacPinConnectMethodAbut = 2,
oacPinConnectMethodFeedthru = 3
};
New Representation
enum oaPinConnectMethodEnum {
oacDefaultPinConnectMethod = 0,
oacRingPinConnectMethod = 1,
oacAbutPinConnectMethod = 2,
oacFeedthruPinConnectMethod = 3
};
oaTermAttrTypeEnum
Old Representation
enum oaTermAttrTypeEnum {
oacTermAttrName = 0,
oacTermAttrHasPins = 1,
oacTermAttrNumBits = 2
};
New Representation
enum oaTermAttrTypeEnum {
oacNameTermAttrType = 0,
oacHasPinsTermAttrType = 1,
oacNumBitsTermAttrType = 2
};
oaTextAlignEnum
Old Representation
enum oaTextAlignEnum {
oacUpperLeft = 0,
oacCenterLeft = 1,
oacLowerLeft = 2,
oacUpperCenter = 3,
oacCenterCenter = 4,
oacLowerCenter = 5,
oacUpperRight = 6,
oacCenterRight = 7,
oacLowerRight = 8
};
New Representation
enum oaTextAlignEnum {
oacUpperLeftTextAlign = 0,
oacCenterLeftTextAlign = 1,
oacLowerLeftTextAlign = 2,
oacUpperCenterTextAlign = 3,
oacCenterCenterTextAlign = 4,
oacLowerCenterTextAlign = 5,
oacUpperRightTextAlign = 6,
oacCenterRightTextAlign = 7,
oacLowerRightTextAlign = 8
};
oaDMDataTypeEnum
Old Representation
enum oaDMDataTypeEnum {
oacLibDataType = UINT_MAX,
oacDMAppObjectDataType = UINT_MAX - 1,
oacDMPropDataType = 0,
oacDMGroupDataType = 1,
oacDMGroupMemDataType = 2,
oacDataCallbackType = 3,
oacAvatarType = 4,
oacCellDataType = 5,
oacViewDataType = 6,
oacCellViewDataType = 7,
oacDMFileDataType = 8,
oacDMFilePurposeDataType = 9
};
New Representation
enum oaDMDataTypeEnum {
oacLibDataType = UINT_MAX,
oacDMAppObjectDataType = UINT_MAX - 1,
oacDMPropDataType = 0,
oacDMGroupDataType = 1,
oacDMGroupMemDataType = 2,
oacDMDataCallbackDataType = 3,
oacDMAvatarDataType = 4,
oacCellDataType = 5,
oacViewDataType = 6,
oacCellViewDataType = 7,
oacDMFileDataType = 8,
oacDMFilePurposeDataType = 9
};
oaLayerOpEnum
Old Representation
enum oaLayerOpEnum {
oaLayerAnd = 0,
oaLayerOr = 1,
oaLayerNot = 2,
oaLayerXor = 3
};
New Representation
enum oaLayerOpEnum {
oacAndLayerOp = 0,
oacOrLayerOp = 1,
oacNotLayerOp = 2,
oacXorLayerOp = 3
};
oaPrefRoutingDirEnum
Old Representation
enum oaPrefRoutingDirEnum {
oacRouteDirNotApplicable = 0,
oacRouteDirNone = 1,
oacRouteDirHorz = 2,
oacRouteDirVert = 3,
oacRouteDirLeftDiag = 4,
oacRouteDirRightDiag = 5
};
New Representation
enum oaPrefRoutingDirEnum {
oacNotApplicablePrefRoutingDir = 0,
oacNonePrefRoutingDir = 1,
oacHorzPrefRoutingDir = 2,
oacVertPrefRoutingDir = 3,
oacLeftDiagPrefRoutingDir = 4,
oacRightDiagPrefRoutingDir = 5
};
oaMaterialEnum
Old Representation
enum oaMaterialEnum {
oacMaterialOther = 0,
oacMaterialNWell = 1,
oacMaterialPWell = 2,
oacMaterialNDiff = 3,
oacMaterialPDiff = 4,
oacMaterialNImplant = 5,
oacMaterialPImplant = 6,
oacMaterialPoly = 7,
oacMaterialCut = 8,
oacMaterialMetal = 9,
oacMaterialContactlessMetal = 10
};
New Representation
enum oaMaterialEnum {
oacOtherMaterial = 0,
oacNWellMaterial = 1,
oacPWellMaterial = 2,
oacNDiffMaterial = 3,
oacPDiffMaterial = 4,
oacNImplantMaterial = 5,
oacPImplantMaterial = 6,
oacPolyMaterial = 7,
oacCutMaterial = 8,
oacMetalMaterial = 9,
oacContactlessMetalMaterial = 10
};
oaPurposeTypeEnum
Old Representation
enum oaPurposeTypeEnum {
oacPurposeDrawing = 0,
oacPurposeFill = 1,
oacPurposeSlot = 2,
oacPurposeOPCSerif = 3,
oacPurposeOPCAntiSerif = 4,
oacPurposeAnnotation = 5,
oacPurposeGapFill = 6
};
New Representation
enum oaPurposeTypeEnum {
oacDrawingPurposeType = 0,
oacFillPurposeType = 1,
oacSlotPurposeType = 2,
oacOPCSerifPurposeType = 3,
oacOPCAntiSerifPurposeType = 4,
oacAnnotationPurposeType = 5,
oacGapFillPurposeType = 6
};
oaRuleParamTypeEnum
Old Representation
enum oaRuleParamTypeEnum {
oacDistanceRuleParam = 0,
oacFrequencyRuleParam = 1,
oacLengthRuleParam = 2,
oacNumCutsRuleParam = 3,
oacWidthRuleParam = 4
};
New Representation
enum oaRuleParamTypeEnum {
oacDistanceRuleParamType = 0,
oacFrequencyRuleParamType = 1,
oacLengthRuleParamType = 2,
oacNumCutsRuleParamType = 3,
oacWidthRuleParamType = 4
};
oaClearanceMeasureEnum
Old Representation
enum oaClearanceMeasureEnum {
oacClearanceMeasureEuclidian = 0,
oacClearanceMeasureMaxXY = 1
};
New Representation
enum oaClearanceMeasureEnum {
oacEuclidianClearanceMeasure = 0,
oacMaxXYClearanceMeasure = 1
};
oaTechDataTypeEnum
Old Representation
enum oaTechDataTypeEnum {
oacTechTechDataType = UINT_MAX,
oacTechAppObjectDataType = UINT_MAX - 1,
oacTechPropDataType = 0,
oacTechGroupDataType = 1,
oacTechGroupMemDataType = 2,
oaTechDataCallbackType = 3,
oacTechAvatarType = 4,
oacTechLayerDataType = 5,
oacTechPurposeDataType = 6,
oacTechSiteDefDataType = 7,
oacTechViaDefDataType = 8,
oacTechOpPointDataType = 9,
oacTechAnalysisLibDataType = 10,
oacTechViaSpecDataType = 11,
oacTechRouteSpecDataType = 12,
oacTechRuleDataType = 13,
oacTechAntennaRatiosDataType = 14
};
New Representation
enum oaTechDataTypeEnum {
oacTechDataType = UINT_MAX,
oacTechAppObjectDataType = UINT_MAX - 1,
oacTechPropDataType = 0,
oacTechGroupDataType = 1,
oacTechGroupMemDataType = 2,
oacTechDataCallbackDataType = 3,
oacTechAvatarDataType = 4,
oacLayerDataType = 5,
oacPurposeDataType = 6,
oacSiteDefDataType = 7,
oacViaDefDataType = 8,
oacOpPointDataType = 9,
oacAnalysisLibDataType = 10,
oacViaSpecDataType = 11,
oacRouteSpecDataType = 12,
oacRuleDataType = 13,
oacAntennaRatiosDataType = 14
};
Stream translator names are now more consistent between Windows and UNIX platforms.
| New Names | Old Names |
|---|---|
| strm2oa.exe | strmIn.exe |
| oa2strm.exe | strmOut.exe |
| New Names | Old Names |
|---|---|
| strm2oa | oaStrmIn |
| oa2strm | oaStrmOut |
View a summary of the OpenAccess 2.2 a005 changes with respect to 2.2 a004.
View a summary of the OpenAccess 2.2 a005 changes with respect to OpenAccess 2.1.
Release date: 02/04/2004
New oaSegStyle Utility Class
The oaSegStyle class encapsulates width, the begin extensions and style, and end extensions and style for an oaPathSeg.
The goal of this API change is to promote the common use model and expected binding mode between techDB and designDB objects: Design objects that refer to tech objects should be bound when the design is in memory.
For example, the following functions are removed:
static oaCustomVia *oaCustomVia::create(oaBlock *block, const oaString &viaDefName, const oaTransform &xform, const oaParamArray *params = NULL);static oaRow *oaRow::create(oaBlock *block, const oaString &siteName, const oaPoint &origin, const oaOrient &rowOrient, oaUInt4 numSites, const oaOrient &siteOrient);You can use the corresponding create-by-pointer functions instead, for example:
static oaCustomVia *oaCustomVia::create(oaBlock *block,
oaCustomViaDef *viaDef,
const oaTransform &xform,
const oaParamArray *params = NULL);
Note: You can still explicitly destroy and recreate def objects, but now the consequences are clearer.
For example, the following function is removed:
void oaSiteDef::setName(const oaString &name);
The following function is removed because techDB is independent of designDB. You can still create a customViaDef by providing the lib/cell/view name of a master.
static oaCustomViaDef *oaCustomViaDef::create(oaTech *tech,
const oaString &name,
oaDesign *master,
oaPhysicalLayer *layer1,
oaPhysicalLayer *layer2);
The following functions are removed because changing the def bound to a via essentially changed the binding of that via to the techDB object.
void oaStdVia::setViaDef(oaStdViaDef *viaDefIn);
Void oaCustomVia::setViaDef(oaCustomViaDef *viaDefIn);
View a summary of the OpenAccess 2.2 a004 changes with respect to 2.2 a003.
View a summary of the OpenAccess 2.2 a004 changes with respect to OpenAccess 2.1.
Release date: 01/21/2004
View a summary of the OpenAccess 2.2 a003 changes with respect to 2.2 a002.
View a summary of the OpenAccess 2.2 a003 changes with respect to OpenAccess 2.1.
Release date: 01/08/2004
You can now perform region queries on vias. Two new public classes are introduced.
View a summary of the OpenAccess 2.2 a002 changes with respect to 2.2 a001.
View a summary of the OpenAccess 2.2 a002 changes with respect to OpenAccess 2.1.
Release date: 12/17/2003
This release contains the OpenAccess 2.2 database and supporting software. The data model supported by the current API supports a broad range of IC implementation applications and design data.
The OpenAccess 2.2 release consists of:
The OpenAccess 2.2 release includes OpenAccess pre-compiled binaries for Sun Solaris 2.8, HP-UX 11.0, IBM AIX 5.1, Linux Redhat 7.2 , Linux Redhat AS 2.1, and Windows 2000/XP. Both 32 and 64 bit versions are included. The pre-compiled binaries include the shared libs containing the database implementation, LEF/DEF translators, and Stream translators.
The OpenAccess 2.2 release includes the complete C++ source code used to build the OpenAccess database API. It includes the source for the OpenAccess database, translators, and unit tests.
OpenAccess 2.2 includes GNUmakefiles for building all the OpenAccess software. (You must use GNU make version 3.80.) If you require a different environment, perform customizations.
For more information about using the GNUmakefiles, see Installation and Configuration Notes.
The Unit tests are self contained programs that exercise the OpenAccess API and compare the behavior to expected results. The GNUmakefiles shipped with OpenAccess are ready to run at your site. No modification should be required.
Each GNUmakefile runs a Unit test. Each test has a set of reference files (under test/testDir/*.ref). If the results of the test are the same as the reference, it passes.
OpenAccess provides solution files that you can use to rebuild OpenAccess. You must use Microsoft Visual Studio .NET 2003.
<install_dir>/oaDynamic.sln
<install_dir>/oaStatic.sln
For more information about using the Visual Studio solutions, see Installation and Configuration Notes.
The Unit tests are self contained programs that exercise the OpenAccess API and compare the behavior to expected results. When you build OpenAccess, an oaTest.exe executable that can run all the unit tests is created.
For more information about oaTest.exe, see Installation and Configuration Notes.
The documentation included in the OpenAccess 2.2 release consists of the following:
Important: See Limitations for information about the state of the documentation for the 2.2 Preview release.
The OpenAccess reference documentation includes an HTML page for each C++ API class. This reference documentation is produced using doxygen version 1.3-rc2, which is a GNU general public license software application that is available as a free download at http://www.stack.nl/~dimitri/doxygen/index.html. Documents produced by doxygen are derivative works derived from the input used in their production. Therefore, the OpenAccess API documentation is not subject to the GNU General Public License and is licensed separately by Cadence Design Systems, Inc. and Silicon Integration Initiative.
Note: The OpenAccess documentation was produced with a modified version of doxygen.
The reference pages are automatically generated by reading the public header files. Human-generated descriptions are added to the automatically generated document framework.
The HTML pages are compatible with Netscape 4.79, but are designed for use with Internet Explorer 6 and Mozilla 1.3.1. The OpenAccess documentation uses JavaScript to implement certain functions such as the navigation bar, which appears on all pages. Your browser must support HTML level 4 and JavaScript. The browser's JavaScript feature must be enabled when viewing the OpenAccess documentation.
The examples in <install_dir>oaDoc/examples are updated to 2.2. The LibStructure, Route, and Via examples, in particular, exhibit changes found in the 2.2 API. Depending on your installation and environment, you might need to edit the <install_dir>oaDoc/examples/macro.defs file before you can compile the examples on UNIX platforms.
The Information Model is a set of schema diagrams showing the relationships among the major database classes and showing the attributes on each class. Each diagram shows a related set of classes. Each class is either linked to the reference documentation, or to the schema diagram that shows its entire set of relationships.
Note: The schema diagrams have not yet been updated for the OpenAccess 2.2 release.
The following are highlights of the OpenAccess 2.2 release.
The OpenAccess DM architecture stores information about the library data and metadata in a library database. With this approach, access to the library data is faster and the information model is more flexible. Access to the library data is controlled through a library server application.
An OpenAccess library consists of design data files, auxiliary files, and the relationships between them.
A project contains library definitions (not implemented in this Preview release).
A library is a directory that contains the library database and all library data. The library database contains all information about the on-disk library including the cells, views, cellViews, associated data files on disk, and the relationships between them. The database also stores the properties, groups, and extensions on the library data. A library is also a logical container object that contains cells, views, and files. A library can have a link to the technology file for that library (which must be contained in the library).
A cell is a container object that contains cellViews and files.
A view is a container object that contains cellViews and files.
A cellView is a container object that contains files. A cellView can have a link to a master file.
A file contains data. Every file has a file purpose, which is a string-valued attribute that defines the purpose for the file. OpenAccess has defined a set of reserved file purposes, which include “designDB”, “techDB”, “reducedDB”, “detailedDB”, “maskDB”, and “reticleDB”. These purposes are used to validate data within OpenAccess. Users can create their own file purposes within a library.
Files can be created or imported into the library using the oaDMFile API.
For the Preview release, library definitions must be added using the oaLib API. Each library definition contains the library name, the library path, and the server information.
You can add library definitions with the API oaLib::addDef(name, path, server).
Class Hierarchy for DM API
The library server is a program that controls multiple client access to the library database and library data. Note that in this 2.2 Preview release, only single client access to the library via the library server is supported.
The library server executable is started as a daemon process on the server machine for the library. A single library server can serve multiple libraries.
oaLib:: find() will find a server for the library, if one exists, and use that server for access to the library. If there is no server currently serving the library, oaLib:: find() will attempt to start a server and attach the server to the library. In this case, the server definition information in the library definition will be used to start the server.
A library server can be controlled through the oaLibServer API.
The library server executable is included in the standard executable location on Windows and UNIX (see Build Hierarchy Changes) as oaLibServer.ex (Windows) or oaLibServer (UNIX). You can manually start the library server executable.
This project implements a RegionQuery plug-in mechanism, which allows multiple region querying solutions to be used. An interface socket for region querying capability will be defined. A default plug-in will be implemented for this socket. The default plug-in will use the standard X/Y tree implementation.
The plug-in mechanism is implemented using two classes. The primary class is oaRegionQueryPlug , which is an abstract class that must be overridden by all plug-in implementers. One plug-in is created, when necessary, for each oaBlock for which region querying is required. oaRegionQueryPlug has several virtual methods that are called to notify the plug-in of changes to the block's data. The plug-in is responsible for keeping its internal data structures current with these changes. The oaRegionQueryPlugMgr class is also abstract; it is used as a “factory” to build plug-ins as required. Again, the plug-in implementer must override this class to add plug-in specific capabilities.
The plug-in mechanism uses the private classes that are part of the implementation of OpenAccess. Using these private classes requires access to the private class definitions as well as advanced knowledge of OpenAccess.
There will be several changes to the oaRegionQuery class API in order to support plug-ins that don't organize shapes by master.
The result of this change is that you can no longer query instances based on their master. In particular, you can no longer use region query methods like startInstHeader() and endInstHeader() . In typical usage, this should not be a problem for application developers because the code in their routines should be handled on an instance-by-instance basis.
From 2.0 and 2.1 usage, we have found that most applications perform multiple queries, one for each type of object. This means the all-in-one API supported by the current region query is not typically used. Because this type of API requires extra overhead, we are eliminating it in order to improve performance and more directly align the API with the way applications use it.
The new 2.2 region query API has multiple region query objects, one for every type of object that can be queried. All region query objects are derived from the oaRegionQuery base class. Each sub-class (such as oaInstQuery or oaShapeQuery ) is specialized for the types of objects it produces.
The goal of this project is to:
The new route API will be easier to understand and use. The previous oaRoute API was difficult to use and inefficient (most code written with the oaRoute API copied information several times to get it into and out of RouteElementArrays). In addition, many of the get methods have been updated to be const.
In the new API, the route elements are managed objects (objects with their own database IDs). Applications can manipulate the route elements as individual objects, and region queries can return the route elements more efficiently.
This means that Vias now exist as standalone objects - they can be created outside of oaRoutes. oaRoutes are now a grouping of regular objects on a given net.
The following objects can now belong to a route:
oaVia - This is now a managed object instead of an element in a RouteElementArray.
oaPathSeg - A 2-pt, orthonormal path-like object (it can be orthogonal or diagonal). Each PathSeg contains its extension values.
Routes contain an array of these elements, which are created independently from the route. Routes have all the same attributes and relationships as in previous releases, including begin and end connection objects, oaRouteSpecs, and belonging to a net. However, begin and end extensions are no longer stored on the route. They are stored on individual oaPathSegs.
Routes are populated and queried using a new oaRouteObjArray utility class, which is a simple array that aggregates the objects belonging to the route.
Most of the oaRoute API is unchanged. Note that there are no longer different create methods for symbolic and geometric routes. If a route has an oaRouteSpec, then it is a symbolic route.
Because edits to routes are now edits to managed objects, routes must tolerate the inconsistencies that show up as intermediate states. Hence routes may be inconsistent with their RouteSpec, and routes may not be well formed in cases where adjacent elements don't meet at the same location or layer. There are methods to convey this status.
The create methods and the methods that now deal with RouteObjArrays instead of RouteElement arrays are the primary changes to oaRoute.
Much of the oaVia API is unchanged. There are still custom and standard vias, and standard vias are still specified with the same oaViaParam objects. The member functions to set and get ViaParams for standard vias and a ParamArray for custom vias are moved into the appropriate derived class.
oaVia's (oaStdVia and oaCustomVia) are now first class objects (whereas in 2.0, they were utility classes embedded in an oaRouteElement). Being first class objects, they are much easier to manage. The derived Via classes now have create and remove methods instead of public constructors and destructors.
Because Vias are now standalone objects, a ViaHeader has a collection of its Vias. You can get the collection of Vias associated with a ViaHeader.
You can use the oaModule::detach function to create a separate design for a module and all its underlying hierarchy, or you can use the oaModule::embed function to embed a design inside an existing module hierarchy. For more information, see the class reference documentation for oaModule.
This can be useful for partitioning (or unpartitioning) a design for a particular implementation.
As part of the changes to the installation hierarchy, support for both single and multi-threaded applications will be delivered in the same shared library (unlike in OpenAccess 2.1, which had separate libraries for each ).
The new <platform> names will better handle the variety of supported operating systems and hardware architectures, particularly for Linux running on different architectures.
Format: <os_name><os_version>[-<hardware_arch>]
Examples:
sunos58
hpux11
aix51
win32
win64
linux72 (IA-32)
linux21 (IA-32 Enterprise version)
linux21-ia64 (Itanium)
linux21-x86 (Opteron 32 bit)
linux21-x86_64 (Opteron 64 bit)
Including <mode> in the directory structure better handles a mixture of shared libraries built for debug and optimized, single-threaded and multi-threaded, and native compiler versus gcc.
Format: <opt | dbg > [Static] [MT] [-64] [-compiler [compiler_version]]
Examples:
opt,
dbg,
optStatic,
dbgStatic,
optMT,
dbgMT,
optMT-64,
dbgMT-64
opt-gcc3.2.3,
dbgMT-64-gcc3.2.3
In addition, the following name changes for key include files and shared libraries are needed to support several new databases in OpenAccess 2.2.
|
Primary Include File |
Shared Library |
||
|
OA 2.1 |
OA 2.2 |
OA 2.1 |
OA 2.2 |
|
oaBase.h |
oaBase.h |
liboaBase.so |
liboaBase.so |
|
oaDD.h |
oaDM.h |
liboaDD.so |
liboaDM.so |
|
oaTC.h |
oaTechDB.h |
liboaTC.so |
liboaTech.so |
|
oaDB.h |
oaDesignDB.h |
liboaDB.so |
liboaDesign.so |
|
oaMaskDB.h |
liboaMask.so |
||
|
oaReticleDB.h |
liboaReticle.so |
||
A similar set of changes are needed for the names of a number of classes.
|
Class Name |
Class Name |
||
|
OA 2.1 |
OA 2.2 |
OA 2.1 |
OA 2.2 |
|
oaTCObject |
oaTechObject |
oaDBObject |
oaDesignObject |
|
oaTCDataType |
oaTechDataType |
oaDBDataType |
oaDesignDataType |
|
oaTCException |
oaTechException |
oaDBException |
oaDesignException |
|
oaTCError |
oaTechError |
oaDBError |
oaDesignError |
|
oaTCFatal |
oaTechFatal |
oaDBFatal |
oaDesignFatal |
|
oaTCCallback |
oaTechObjectCallback |
oaDBCallback |
oaDesignObjectCallback |
|
oaDBUndoCallback |
oaDesignUndoCallback |
||
A script that automatically updates client source code to reflect changes to the object names in OA 2.2 is available in under <install_dir>/build/bin/UpdateToOA22. There is a companion file, UpdateToOA22.sed, which contains the rules that UpdateToOA22 uses. You can run the updater in different modes specified by a command-line option:
UpdateToOA22 [-t | -T | -q | -s] <file> ...
-t Test changes, showing diffs without saving the changes
-T Test changes, saving them in file.oa22 for each file
-q Show diff of each file and prompt whether to save changes in place
-s Make changes silently in place
The –t option is useful to get a quick feel about what will be changed, while the –T option is useful for doing a graphical diff. The –s option is useful after confirming that the changes are correct with either –t or –T.
The script attempts to update class names and variable names in a consistent way, but the changes it makes may not be appropriate for all client code. Because “Design” contains fewer letters than “CellView”, the script will affect the format of the source code. After running the script, you should inspect the modified files and fix any issues introduced by the script.
OpenAccess supports LEF and DEF 5.5.
Blockage is now associated with an LPP instead of a layer.
Not every purpose makes sense for blockage, so the purpose will be derived from the user-defined blockage type as follows:
User-Defined Blockage Type |
Derived Purpose |
| oacRoutingBlockageType | oacPurposeDrawing |
| oacViaBlockageType | oacPurposeDrawing |
| oacWiringBlockageType | oacPurposeDrawing |
| oacFillBlockageType | oacPurposeFill |
| oacSlotBlockageType | oacPurposeSlot |
| oacPinBlockageType | oaPurposeDrawing |
| oacFeedthruBlockageType | oacPurposeDrawing |
| oacScreenBlockage | oacPurposeDrawing |
oacPlacementBlockageType |
Throw an exception if layer is specified (current behavior). |
View a summary of the 2.2 API changes with respect to version 2.1.

Copyright © 2003-2004
All rights reserved.