• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Blogs
  2. Digital Design
  3. The Case for Robust Database Access
BobD
BobD

Community Member

Blog Activity
Options
  • Subscribe by email
  • More
  • Cancel
CDNS - RequestDemo

Have a question? Need more information?

Contact Us
First Encounter
Hierarchical Module Ports
robust data access
Digital Implementation
CTS

The Case for Robust Database Access

12 Jul 2008 • 3 minute read

The most frequently viewed forum post in the old cdnusers.org "Digital IC->Floorplanning, Place and Route" forum initially started off as a seemingly simple inquiry: "Can CTS Stop Tracing on Hierarchical Module Ports?"

From that one question came a number of suggestions and discussion about using First Encounter (FE) Clock Tree Synthesis (CTS) LeafPin and LeafPort constructs and whether they could succesfully be applied to hierarchical ports (they can't) and consequently how to identify the downstream pins that a hierarchical port connects to.

FE offers a way to find the downstream instances via its GUI-driven design browser, but this task was sought to be performed automatically as part of a scripted flow that would determine these pin names across netlist changes.  Further, it was desirable to automatically modify the clock tree specification file to drive these changes from the netlist. Thus enters the need for robust and easy-to-use db access commands.

Since it would be impractical for an EDA design tool to offer a natively defined command for any circumstance a user might envision (what would the command be called in this case? "findAllDownstreamPinsFromHierarchicalPinAndHackMyClockTreeSpecFile"?) tools have long provided scripting languages to provide users access to the database.  Users will tell you that db access is not a simple "have it or not" feature; all contemporary backend systems have db access mechanisms of some sort.

It is the ease of use, the consistensy and the robustness of the db access offered that determines whether the access adds value in to typical user and I would argue in large part determines whether the platform as a whole is likely to be successful.

No software is perfect -- there's always customization and querying required on the users part to get designs completed on schedule.  It is therefore in everyone's best interest to have a robust mechanism for users to query and modify the database effectively.  If the system is architected in this way it becomes a great canvas for designers to perform their artwork upon.  If not it risks becoming known as a career killer.

In FE, we've had a long-standing db access mechanism I refer to as "FE-TCL".  These are commands like "dbForEachCellInst" and "dbGetNetByName".  While these commands are powerful and often efficient, some users feel that they lack the ease of use and consistensy to be as useful as the could be otherwise.  Given these limitations, I'd like to mention two other database access mechanisms that users are often unaware of:

The first mechanism is "CTE-TCL".  CTE-TCL commands (like "all_fanout", "report_property" and "get_pins") provide robust access to the netlist and, more typically, timing information in the tool.  Consider using these commands for tasks such as finding all downstream sinks from a given pin through combinational logic, or finding all of the registers connected to a logical clock.  More information on CTE-TCL commands can be found in the FE Text Command Reference in the "Advanced Timing Tcl Scripting" chapter.

The second mechanism comes to us in the form of 2 simple commands: dbGet and dbSet. dbGet and dbSet were introduced in SOC7.1 as a way of providing users with mechanisms for probing the database consistently, traversing the design in a relational manner, and efficiently performing common tasks.  Here a few examples of how dbGet/Set can be used from recent user inquiries:

   1. How do I get a list of the nets with routing on M6?
      Example: "dbGet [dbGet -u -p3 top.nets.wires.layer.name M6].name"

   2. How do I convert all of the hard placement obstructions into soft placement obstructions?
      Example: "dbSet top.fplan.pBlkgs.type soft"

   3. How do I add all of the instances of cell type BUFX1 to an instance group?
      Example: "foreach inst [dbGet [dbGet -p2 top.insts.cell.name BUFX1].name] {addInstToInstGroup myGroup $inst}"

More information on dbGet can be found in the Encounter Database Access Command Reference.

By the way, as I'm writing this blog entry, the forum post I'm referring to had more than 12,000 views.  Not too shabby!  I'd like to personally thank all of you who made cdnusers.org a great place to exchange ideas and get solutions.  Without your posts, the community wouldn't be possible.  I look forward to continuing the discussion with you all in this new setting on cadence.com.

Okay, question of the day:  "What is your favorite db access mechanism of all time?  Why?"  Please post your answer as a comment below -- I'd love to hear from you.


CDNS - RequestDemo

Try Cadence Software for your next design!

Free Trials

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information