discuss-gnu-electric
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Any BeanShell example for 8.08 : revisited


From: Steven Rubin
Subject: Re: Any BeanShell example for 8.08 : revisited
Date: Tue, 31 Mar 2009 11:22:13 -0700

At 12:09 AM 3/31/2009, you wrote:
Hello,

we are kind of new to electric but really want to explore that path. However, we have a background with extensive scripting of our layouts and would like to see how that can be done in electric.

Now, initially, I get lost in the java classes and methods. I've seen the example in this group: "Any BeanShell example for 8.0.1?", but I would like to know if anyone has examples in beanshell on how to e.g.

  create a (layout) cell view and a library
  ... instantiate a transistor into that cell
  ... add a couple of vias and arcs,
  i.e., generate a simple inverter?

Essentially I use the following meta-approach (and fail):

        Cell lay = WindowFrame.getCurrentCell();
        NodeInst node1 = newInstance(lay, proto, "pmos", <etc>)
        lay.addNode()

But I get stuck... should I (search and) use other primitives, such as e.g.

  // assume technology information is properly inherited
  pTransId  = lay.addTransistor("pmos", pPoint2D, paramHash, orien);
  nTransId  = lay.addTransistor("nmos", nPoint2D, paramHash, orien);
  polyArcId = lay.connectNodes(nTransId.G, pTransId.G);
  metArcId  = lay.connectNodes(nTransId.D, pTransId.D);

etc.

Any simple example to start with would be highly appreciated.

Thanks in advance

Unfortunately, the Bean Shell isn't the greatest scripting environment. Besides the fact that you must access the Electric API, which is vast and difficult to access from outside of Electric, there is also the disadvantage that the Bean Shell doesn't help much with debugging. In general, I create my scripts inside of Electric and debug them there, then I save them as external Bean Shell code pieces.

Here is an example of a Bean Shell script that creates an inverter. Note one other problem with the script: the term "Export" is a Bean Shell term, and so the Electric version of it must always be fully qualified (i.e. it must be called "com.sun.electric.database.hierarchy.Export".

Also, although you used the GNU mailing list to discuss this issue, the Google group is more active, so I have posted this reply to both lists.

   -Steven Rubin

--------------------------------------------------------------------------------------------

import com.sun.electric.database.geometry.EPoint;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.prototype.NodeProto;
import com.sun.electric.database.topology.ArcInst;
import com.sun.electric.database.topology.NodeInst;
import com.sun.electric.technology.ArcProto;
import com.sun.electric.technology.PrimitiveNode;

// get all necessary objects to be placed
PrimitiveNode trP = (PrimitiveNode)Cell.findNodeProto("mocmos:P-Transistor");
PrimitiveNode trN = (PrimitiveNode)Cell.findNodeProto("mocmos:N-Transistor");
PrimitiveNode coP = (PrimitiveNode)Cell.findNodeProto("mocmos:Metal-1-P-Active-Con"); PrimitiveNode coN = (PrimitiveNode)Cell.findNodeProto("mocmos:Metal-1-N-Active-Con");
PrimitiveNode m1p = (PrimitiveNode)Cell.findNodeProto("mocmos:Metal-1-Pin");
PrimitiveNode pop = (PrimitiveNode)Cell.findNodeProto("mocmos:Polysilicon-1-Pin");
ArcProto m1 = ArcProto.findArcProto("mocmos:Metal-1");
ArcProto aN = ArcProto.findArcProto("mocmos:N-Active");
ArcProto aP = ArcProto.findArcProto("mocmos:P-Active");
ArcProto po = ArcProto.findArcProto("mocmos:Polysilicon-1");

// create the new cell with the placed circuitry
Cell newCell = Cell.makeInstance(Library.getCurrent(), "BigCell{lay}");

// place two transistors
NodeInst tN = NodeInst.makeInstance(trN, new EPoint(0, 0), trN.getDefWidth(), trN.getDefHeight(), newCell); NodeInst tP = NodeInst.makeInstance(trP, new EPoint(0, 30), trP.getDefWidth(), trP.getDefHeight(), newCell);

// place two metal-Active contacts and an intermediate M1 pin
NodeInst maN = NodeInst.makeInstance(coN, new EPoint(0, 6), coN.getDefWidth(), coN.getDefHeight(), newCell); NodeInst maP = NodeInst.makeInstance(coP, new EPoint(0, 24), coP.getDefWidth(), coP.getDefHeight(), newCell); NodeInst mJ = NodeInst.makeInstance(m1p, new EPoint(0, 15), m1p.getDefWidth(), m1p.getDefHeight(), newCell);

// place three poly pins to connect the gates
NodeInst ppN = NodeInst.makeInstance(pop, new EPoint(-10, 0), pop.getDefWidth(), pop.getDefHeight(), newCell); NodeInst ppP = NodeInst.makeInstance(pop, new EPoint(-10, 30), pop.getDefWidth(), pop.getDefHeight(), newCell); NodeInst ppJ = NodeInst.makeInstance(pop, new EPoint(-10, 15), pop.getDefWidth(), pop.getDefHeight(), newCell);

// place input/output pins
NodeInst inPin = NodeInst.makeInstance(pop, new EPoint(-20, 15), pop.getDefWidth(), pop.getDefHeight(), newCell); NodeInst outPin = NodeInst.makeInstance(m1p, new EPoint(10, 15), m1p.getDefWidth(), m1p.getDefHeight(), newCell);

// wire the transistors to the contacts
ArcInst.makeInstance(aN, tN.findPortInst("diff-top"), maN.findPortInst("metal-1-n-act")); ArcInst.makeInstance(aP, tP.findPortInst("diff-bottom"), maP.findPortInst("metal-1-p-act"));

// wire the contacts together
ArcInst.makeInstance(m1, maN.findPortInst("metal-1-n-act"), mJ.findPortInst("metal-1")); ArcInst.makeInstance(m1, mJ.findPortInst("metal-1"), maP.findPortInst("metal-1-p-act")); ArcInst.makeInstance(m1, mJ.findPortInst("metal-1"), outPin.findPortInst("metal-1"));

// wire the gates together
ArcInst.makeInstance(po, tN.findPortInst("poly-left"), ppN.findPortInst("polysilicon-1")); ArcInst.makeInstance(po, tP.findPortInst("poly-left"), ppP.findPortInst("polysilicon-1")); ArcInst.makeInstance(po, ppN.findPortInst("polysilicon-1"), ppJ.findPortInst("polysilicon-1")); ArcInst.makeInstance(po, ppP.findPortInst("polysilicon-1"), ppJ.findPortInst("polysilicon-1")); ArcInst.makeInstance(po, inPin.findPortInst("polysilicon-1"), ppJ.findPortInst("polysilicon-1"));

// export input and output
com.sun.electric.database.hierarchy.Export.newInstance(newCell, inPin.findPortInst("polysilicon-1"), "IN", PortCharacteristic.IN); com.sun.electric.database.hierarchy.Export.newInstance(newCell, outPin.findPortInst("metal-1"), "OUT", PortCharacteristic.OUT);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]