MAGIC Magic Mailing List
 
 

From: Jeff W. Sondeen (sondeen AT rcf-fs DOT usc.edu)
Date: Mon May 22 2000 - 12:45:29 EDT


Andrew Lines writes:
 > This is a multi-part message in MIME format.
 > --------------BAEB9CDB04944B283676C6A7
 > Content-Type: text/plain; charset=us-ascii
 > Content-Transfer-Encoding: 7bit
 > 
 > I fixed a subtle bug in the cifSquareFunc (which generates the cut
 > pattern for magic contacts).  The code assumes that the magic contact,
 > cut size, and cut spacing are all even centimicrons.  Unfortunately for
 > lambda = 0.09um, this doesn't always hold.  The routine can't center the
 > cut pattern exactly in the magic contact.  Therfore, overlapping
 > contacts between different subcells may generate inconsistent cuts.
 > This is impossible to completely avoid with an odd lamba (except by
 > adding a highly inconvenient no_overlap design rule for contacts!)
 > 
 > However, the problem can be mostly solved by changing cifSquareFunc to
 > find the center of the square by trunctating toward negative infinity,
 > instead of toward zero.  At least this lets you overlap contacts between
 > cells which haven't been flipped upsidedown or sideways with respect to

well, this is not a good idea (when allowing contacts to overlap
between cells) since it allows magic to (possibly) generate bad
contacts when contacts overlap between cells with non-identity
orientations (as you point out below).

 > each other.  This works great for arrays elements which share contacts
 > (which is the most common place you would do that).
 > 
 > We run our layout through Mentor Graphic's Calibre program before
 > submitting it, so is acceptable for us to catch uncommon errors that
 > slip past Magic.  If you want to solely use Magic for DRC checking,
 > you'd better avoid odd lambdas or overlapping contacts!

yes, but it's not just odd lambdas -- the problem can happen whenever
magic contact sizes aren't exact multiples of size/space/overlap (and
overlap across cells at non-identity orientations).

maybe we need a new rule -- that contacts must be an exact multiple of
size/space/overlap -- so that your approach could be incorporated into
magic generally.

/jeff


 > 
 > Here is the new code in cif/CIFgen.c.  (Rajit, could you explain how to
 > work your Magic cvs repository?)  By the way, I did NOT fix
 > cifSquareGridFunc because I don't use that, but perhaps somebody should
 > to keep it consistent.
 > 
 > int
 > cifSquareFunc(tile, op)
 >     Tile *tile;   /* Tile to be diced up. */
 >     CIFOp *op;   /* Describes how to generate squares. */
 > {
 >     Rect area, square;
 >     int i, nAcross, j, nUp, left, xcenter, ycenter;
 > 
 >     TiToRect(tile, &area);
 > 
 >     /* Compute the real border to leave around the sides.  If only
 >      * one square will fit in a particular direction, center it
 >      * regardless of the requested border size.  If more than one
 >      * square will fit, then fit it in extras only if at least the
 >      * requested border size can be left.  Also center things in the
 >      * rectangle, so that the box's exact size doesn't matter. This
 >      * trickiness is done so that (a) coincident contacts from
 > overlapping
 >      * cells always have their squares line up, regardless of the
 >      * orientation of the cells, and (b) we can generate contact vias
 >      * for non-square contact areas, for example poly-metal contacts
 >      * in the MOSIS CMOS process.
 >      */
 > 
 >     /* AML: round center of area toward -infinity to be consistent for
 > odd centerings */
 >     xcenter = area.r_xbot + (area.r_xtop - area.r_xbot)/2;
 >     ycenter = area.r_ybot + (area.r_ytop - area.r_ybot)/2;
 > 
 >     nAcross = (area.r_xtop - area.r_xbot + op->co_bloats[2]
 >      - (2*op->co_bloats[0])) / (op->co_bloats[1] + op->co_bloats[2]);
 >     if (nAcross == 0)
 >     {
 >  left = xcenter - op->co_bloats[1]/2;
 >  if (left >= area.r_xbot) nAcross = 1;
 >     }
 >     else
 >     {
 >  left = xcenter + (op->co_bloats[2] - (nAcross * (op->co_bloats[1] +
 > op->co_bloats[2])))/2;
 >     }
 > 
 >     nUp= (area.r_ytop - area.r_ybot + op->co_bloats[2]
 >      - (2*op->co_bloats[0])) / (op->co_bloats[1] + op->co_bloats[2]);
 >     if (nUp == 0)
 >     {
 >  square.r_ybot = ycenter - op->co_bloats[1]/2;
 >  if (square.r_ybot >= area.r_ybot) nUp = 1;
 >     }
 >     else
 >     {
 >  square.r_ybot = ycenter + (op->co_bloats[2] - (nUp * (op->co_bloats[1]
 > + op->co_bloats[2])))/2;
 >     }
 > 
 >     for (i = 0; i < nUp; i += 1)
 >     {
 >  square.r_ytop = square.r_ybot + op->co_bloats[1];
 >  square.r_xbot = left;
 >  for (j = 0; j < nAcross; j += 1)
 >  {
 >      square.r_xtop = square.r_xbot + op->co_bloats[1];
 >      DBPaintPlane(cifPlane, &square, CIFPaintTable,
 >   (PaintUndoInfo *) NULL);
 >      CIFTileOps += 1;
 >      square.r_xbot += op->co_bloats[2] + op->co_bloats[1];
 >  }
 >  square.r_ybot += op->co_bloats[2] + op->co_bloats[1];
 >     }
 > 
 >     return 0;
 > }
 > 
 > 
 > --------------BAEB9CDB04944B283676C6A7
 > Content-Type: text/x-vcard; charset=us-ascii;
 >  name="lines.vcf"
 > Content-Transfer-Encoding: 7bit
 > Content-Description: Card for Andrew Lines
 > Content-Disposition: attachment;
 >  filename="lines.vcf"
 > 
 > begin:vcard 
 > n:Lines;Andrew
 > tel;fax:(626) 844-2951
 > tel;home:(626) 568-4928
 > tel;work:(626) 844-2941
 > x-mozilla-html:FALSE
 > url:www.avlsi.com
 > org:Asynchronous Digital Design Inc.
 > adr:;;1010 E. Union #202;Pasadena;CA;91106;USA
 > version:2.1
 > email;internet:lines AT avlsi DOT com
 > title:Founder
 > x-mozilla-cpt:;11936
 > fn:Andrew Lines
 > end:vcard
 > 
 > --------------BAEB9CDB04944B283676C6A7--


 
 
Questions? Contact Rajit Manohar
cornell logo