[fa.info-vlsi] Magic Bug Report

info-vlsi@ucbvax.ARPA (06/07/85)

From: ouster@ucbkim (John Ousterhout)

I propose to use this distribution list for reporting bugs in the
Magic system and their fixes.  Magic's now at about 100 sites, and
I don't know of any other way to get in touch with people when we
find major problems.  My plan is to use info-vlsi only for relatively
important (potentially disabling) bugs that have relatively simple
fixes.  Minor inconveniences and bugs that require major modifications
will have to wait for dissemination until the next release (end of
'85?).  This message and the next one contain the first two such
bugs we've found.  I hope that these messages won't appear more than
once or twice a month, at most.  If you think this is improper usage
of invo-vlsi, let me know; if enough people complain I'll stop the
bug reports.

Magic Bug Report
April 24, 1985

Symptoms:
    Spurious design-rule violations involving interactions between
    cells.  Occurs primarily in the CMOS process, and results in
    error messages of the form "can't overlap those layers" even
    though the overlap is valid.

Fix:
    Go to the file src/drc/DRCtech.c and find the procedure DRCTechInit.
    Locate the piece of code that corresponds to the fragment below, and
    replace it with the fragment below.

    for (plane = 0; plane < DBNumPlanes; plane++)
    {
	/* printf("Plane is %s.\n", DBPlaneLongName(plane)); */
	for (i = 0; i < DBNumTypes; i++)
	    for (j = 0; j < DBNumTypes; j++)
	    {
		PaintResultType result = DBPaintResultTbl[plane][i][j];
		if ((i == TT_ERROR_S) || (j == TT_ERROR_S))
		    DRCPaintTable[plane][i][j] = TT_ERROR_S;
		else if ((i == TT_SPACE) || (j == TT_SPACE)
			|| (DBPlane(j) != plane)
			|| !DBPaintOnPlane(i, DBPlane(j)))
		    DRCPaintTable[plane][i][j] = result;
		else if ((!TTMaskHasType(&DBLayerTypeMaskTbl[i], result)
			&& !TTMaskHasType(&DBLayerTypeMaskTbl[j], result))
			|| ((result != DBPaintResultTbl[plane][j][i])
			&& (DBPlane(i) == plane)
			&& DBPaintOnPlane(j, DBPlane(i))))
		{
		    DRCPaintTable[plane][i][j] = TT_ERROR_S;
		    /* printf("Error: %s on %s, was %s\n", DBTypeShortName(i),
			    DBTypeShortName(j), DBTypeShortName(result)); */
		}
		else
		    DRCPaintTable[plane][i][j] = result;
	    }
    }