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--
|
|