Cadence® system design and verification solutions, integrated under our System Development Suite, provide the simulation, acceleration, emulation, and management capabilities.
System Development Suite Related Products A-Z
Cadence® digital design and signoff solutions provide a fast path to design closure and better predictability, helping you meet your power, performance, and area (PPA) targets.
Full-Flow Digital Solution Related Products A-Z
Cadence® custom, analog, and RF design solutions can help you save time by automating many routine tasks, from block-level and mixed-signal simulation to routing and library characterization.
Overview Related Products A-Z
Driving efficiency and accuracy in advanced packaging, system planning, and multi-fabric interoperability, Cadence® package implementation products deliver the automation and accuracy.
Cadence® PCB design solutions enable shorter, more predictable design cycles with greater integration of component design and system-level simulation for a constraint-driven flow.
An open IP platform for you to customize your app-driven SoC design.
Comprehensive solutions and methodologies.
Helping you meet your broader business goals.
A global customer support infrastructure with around-the-clock help.
24/7 Support - Cadence Online Support
Locate the latest software updates, service request, technical documentation, solutions and more in your personalized environment.
Cadence offers various software services for download. This page describes our offerings, including the Allegro FREE Physical Viewer.
Get the most out of your investment in Cadence technologies through a wide range of training offerings.
This course combines our Allegro PCB Editor Basic Techniques, followed by Allegro PCB Editor Intermediate Techniques.
Virtuoso Analog Design Environment Verifier 16.7
Learn learn to perform requirements-driven analog verification using the Virtuoso ADE Verifier tool.
Exchange ideas, news, technical information, and best practices.
The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information.
It's not all about the technlogy. Here we exchange ideas on the Cadence Academic Network and other subjects of general interest.
Cadence is a leading provider of system design tools, software, IP, and services.
i need the code to change the metal layers in layout, EX: when the code is loaded all the M1 layers in layout should be replaced by M2 automatically. iam able to do till gettin the available layers..but iam not able to replace them
Since you managed to get the layer. it will be easy for you to replace the metal layers.
Example of changing a selected shapes from M1 to M2 on current cell view:
selected_obj = geGetSelectedSet()
foreach( obj selected_obj
when( obj_id~>layerName == "M1"
obj_id~>lpp = list("M2" "drawing")
This is just an example to show you a simple way in changing the layer. You may write a routine for this. Happy coding.
if you want to replace all the M1 layers in the current cellview (Selected or unselected) then do this.
when( geGetEditCellView()->mode == "r" println( "Need write access" ) return() );when
foreach( shape geGetEditCellView()->shapes
when( shape->layerName == "M1" ; or shape->lpp == list( "M1" "drawing" )
shape->lpp = list( "M2" "drawing" ) ; or shape->layerName = "M2"
In reply to babji:
In reply to Andrew Beckett:
How about if we want to change all M1 shapes (Selected or not, level 0) can we do this.
setof( X geGetEditCellView( )~>shapes X~>lpp == list( "M1" "drawing" ) )~>lpp = list( "M2" "drawing" )
You could, though it would be more efficient to find the matching lpp object first and then find its shapes, then iterate over those shapes to change the layer and purpose. I don't have an example to hand, but it would be something like the following:
m1lpp = car(setof(lpp geGetEditCellView()~>lpps lpp~>layerName=="M1" && lpp~>purpose=="drawing"))
foreach(shape m1lpp~>shapes shape~>lpp=list("M2" "drawing"))
Typically the number of shapes to process is an order of magnitude or more greater than the number of distinct layer-purpose pairs, hence the probable efficiency gain. YMMV depending on the design of course.
In reply to skillUser:
I should point out that Andrew's response is even more efficient since my example shows the use of foreach to iterate over the shapes to change their lpp, where really you can have a list on the left-hand side of the = when using the ~> operator and update the lpp for all items in the list in one hit (as babji also showed in their post).
In reply to Rahul Biradar:
It is just another big loop.
You need a list: processed cellViews
Start of processing loop:
Change layers in the current cellView.
Save the cellView
Add its name to the list of processed cellViews.
You have to find all the instance masters in the current cellView (cvId~>instHeaders~>master)
Close the cellView (this minimizes the number of open cellViews)
for each master not in the list of processed cellViews
Open the master for append
Do the processing loop in the master
Keep processing the masters till all are done
End of processing loop
From an architecture standpoint, the loop should be in a function and called recursively.
In reply to theopaone:
Or you could just use leReplace().
You can use leSearchHierarchy to find the objects and leReplace to update the layer.
Andrew may have some hierarchy parsing code which he shares.
Some untested code showing the idea of a recursive layer replacement rather than leReplace:
procedure(CCFreplaceLayersHier(cv @optional (done makeTable('visited nil))) let((LP) done[cv]=t LP=car(exists(lpp cv~>lpps lpp~>layerName=="M1" && lpp~>purpose=="drawing")) ; if there are shapes, and this isn't a pcell submaster, and it can be reopened in edit mode when(LP~>shapes && !(cv~>superMaster) && dbReopen(cv "a") LP~>shapes~>lpp=list("M2" "drawing") ) ; recursively visit all the child masters foreach(master cv~>instanceMasters unless(done[master] CCFreplaceLayersHier(master done) ) ) t ))
Thank you for your replies
hi Andrew Beckett
the below code is not working but it's executing...... please help me with this
I just tried the code above, and it worked for me. I have a technology where the layers are called M1, M2 etc - you'd obviously have to change the layer names in the code if they're called something different.
Then I opened the top level layout, and used:
Note however that the code won't replace M1 used in MPP (multi-part path) or in vias, or inside PCells. Of course, I have no idea what the extent of what you're trying to do is...