Hi Bernd,
Well, it may have been convenient, but was undocumented, and just as well, as
it works differently in OA. OA is designed by the Open Access consortium, not
Cadence alone.
So, you could always become a member of the OA consortium and campaign for
them to add this to the OA database. I think that's very unlikely to happen
though!
If it's not part of the database, we can't really add it, can we? In CDBA,
pc.db was part of the database, effectively.
I don't understand your argument that foreach loops mean that specific pcdb
functions make no sense.
APIs are always a good thing - they hide implementation details, so that
things can be changed underneath without affecting applications.
I've also used the ccpExpand API in the past for collecting this kind of
information. Here's some code to illustrate that:
/* abNewLibraryRefs.il
Author A.D.Beckett
Group Custom IC (UK), Cadence Design Systems Ltd.
Language SKILL
Date Jan 12, 1999
Modified Feb 19, 2003
By A.D.Beckett
Uses the new ccpExpand facilities to expand library data,
either using the pc.db files (parent child databases),
or using config files to find all the cellViews or libraries
used. This is quicker than opening databases, and also supports
configurations.
Each of the four functions can be used externally.
***************************************************
SCCS Info: @(#) abNewLibraryRefs.il 02/19/03.09:56:33 1.2
*/
/****************************************************************
* *
* (abNewCellViewRefs libName cellName viewName @optional *
* (expandMode 'CCP_EXPAND_COMANAGED)) *
* *
* Expand the specified cellView, returning a list of lists of *
* cellView information. The expandMode is the keyword to pass *
* to ccpExpand.* functions to say what files to include. The *
* default should be adequate for most cases. The expansion will *
* follow through the complete design hierarchy, into other *
* libraries, since it uses the pc.db and config information. *
* *
****************************************************************/
(procedure (abNewCellViewRefs libName cellName viewName @optional
(expandMode 'CCP_EXPAND_COMANAGED))
(let (spec expanded cellViews cellViewInfo obj)
(setq obj (ddGetObj libName cellName viewName))
(setq spec (gdmCreateSpecFromDDID obj))
(setq expanded
(cond
((ddGetObj libName cellName viewName "pc.db")
(ccpExpandDesign spec expandMode))
((ddGetObj libName cellName viewName "expand.cfg")
(ccpExpandConfig spec expandMode))
(t
(setq specList (gdmCreateSpecList))
(gdmAddSpecToSpecList spec specList)
(ccpExpand specList expandMode))
))
(gdmResetSpecList expanded)
(while (setq spec (gdmNextFromSpecList expanded))
(when (and
(setq cellViewInfo (gdmInspectSpec spec "LibraryUnix"))
(equal (cadddr cellViewInfo) "master.tag"))
(rplacd (cddr cellViewInfo) nil)
(setq cellViews (cons cellViewInfo cellViews))
)
)
cellViews
))
/**********************************************************************
* *
* (abNewLibraryRefs libName @optional sorted) *
* *
* Get all cellViews in a library, invoke abNewCellViewRefs on them, *
* and then collate the information into a list of lists. The *
* optional argument is a flag to indicate that the information should *
* be sorted. *
* *
**********************************************************************/
(procedure (abNewLibraryRefs libName @optional sorted)
(let (libObj cellViews cellViewTable)
(unless
(setq libObj (ddGetObj libName))
(error "Could not open library %s\n" libName)
)
/* create a table - easy way of removing duplicates */
(setq cellViewTable (makeTable 'cellViewTable))
/* visit all cells */
(foreach cell (getq libObj cells)
/* visit all cellViews */
(foreach view (getq cell views)
/* get all the references, even through other libs */
(setq cellViews
(abNewCellViewRefs
libName (getq cell name) (getq view name)))
/* record any cellViews used in the table */
(foreach cellView cellViews
(setarray cellViewTable cellView t))
))
/* pull out everything from the table */
(setq cellViews nil)
(foreach cellView cellViewTable
(setq cellViews (cons cellView cellViews)))
/* if sorted has been supplied and set to non-nil, sort the
list before returning it */
(when sorted
(setq cellViews
(sort cellViews
/* comparison function - sorts strings in lists */
(lambda (a b)
(while (and
(car a) (car b)
(equal (car a) (car b)))
(setq a (cdr a))
(setq b (cdr b)))
(and (car a) (car b)
(alphalessp (car a) (car b)))
))
))
cellViews
))
/*************************************************************************
* *
* (abNewLibrariesUsed libName) *
* *
* Process the library, expand the design hierarchies and configurations, *
* and find out all the libraries referenced, directly or indirectly. *
* *
*************************************************************************/
(procedure (abNewLibrariesUsed libName)
(let (libs)
(foreach cellView (abNewLibraryRefs libName)
(unless (member (car cellView) libs)
(setq libs (cons (car cellView) libs))))
libs
))
/****************************************************************************
* *
* (abNewLibrariesUsedByCellView libName cellName viewName) *
* *
* Process the cellView, expanding the hierarchy, and find out all libraries *
* referenced, directly or indirectly. *
* *
****************************************************************************/
(procedure (abNewLibrariesUsedByCellView libName cellName viewName)
(let (libs)
(foreach cellView (abNewCellViewRefs libName cellName viewName)
(unless (member (car cellView) libs)
(setq libs (cons (car cellView) libs))))
libs
))
Regards,
Andrew.