196 lines
5.1 KiB
C
196 lines
5.1 KiB
C
/*
|
|
* DRCPrint.c --
|
|
*
|
|
* Edge-based design rule checker
|
|
*
|
|
* *********************************************************************
|
|
* * Copyright (C) 1985, 1990 Regents of the University of California. *
|
|
* * Permission to use, copy, modify, and distribute this *
|
|
* * software and its documentation for any purpose and without *
|
|
* * fee is hereby granted, provided that the above copyright *
|
|
* * notice appear in all copies. The University of California *
|
|
* * makes no representations about the suitability of this *
|
|
* * software for any purpose. It is provided "as is" without *
|
|
* * express or implied warranty. Export of this software outside *
|
|
* * of the United States of America may require an export license. *
|
|
* *********************************************************************
|
|
*/
|
|
|
|
#ifndef lint
|
|
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/drc/DRCprint.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
|
|
#endif /* not lint */
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "utils/magic.h"
|
|
#include "utils/geometry.h"
|
|
#include "tiles/tile.h"
|
|
#include "utils/hash.h"
|
|
#include "database/database.h"
|
|
#include "drc/drc.h"
|
|
|
|
extern char *maskToPrint();
|
|
extern char *DBTypeShortName();
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* drcGetName --
|
|
*
|
|
* This is a utility procedure that returns a convenient name for
|
|
* a mask layer.
|
|
*
|
|
* Results:
|
|
* The result is the first 8 characters of the long name for
|
|
* the layer.
|
|
*
|
|
* Side effects:
|
|
* None.
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
char *
|
|
drcGetName(layer, string)
|
|
int layer;
|
|
char *string; /* Used to hold name. Must have length >= 8 */
|
|
{
|
|
(void) strncpy(string, DBTypeShortName(layer), 8);
|
|
string[8] = '\0';
|
|
if (layer == TT_SPACE) return "space";
|
|
return string;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
* DRCPrintRulesTable --
|
|
*
|
|
* Write compiled DRC rules table and adjacency matrix to the given file.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None.
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
DRCPrintRulesTable (fp)
|
|
FILE *fp;
|
|
{
|
|
int i, j, k;
|
|
DRCCookie * dp;
|
|
char buf1[20], buf2[20];
|
|
int gotAny;
|
|
/* print the rules table */
|
|
for (i = 0; i < DBNumTypes; i++)
|
|
{
|
|
gotAny = FALSE;
|
|
for (j = 0; j < DBNumTypes; j++)
|
|
{
|
|
if (DRCCurStyle->DRCRulesTbl [i][j] != (DRCCookie *) NULL)
|
|
{
|
|
k = 1;
|
|
for (dp = DRCCurStyle->DRCRulesTbl [i][j]; dp != (DRCCookie *) NULL;
|
|
dp = dp->drcc_next)
|
|
{
|
|
gotAny = TRUE;
|
|
if (k == 1)
|
|
{
|
|
fprintf(fp,"%-8s %-8s ",drcGetName(i, buf1),
|
|
drcGetName(j, buf2));
|
|
k++;
|
|
}
|
|
else fprintf(fp," ");
|
|
|
|
fprintf(fp,"%d x %d %s (%s)\n",
|
|
dp->drcc_dist, dp->drcc_cdist,
|
|
maskToPrint(&dp->drcc_mask),
|
|
DBPlaneLongName(dp->drcc_plane));
|
|
fprintf(fp," %s",
|
|
maskToPrint(&dp->drcc_corner));
|
|
if (dp->drcc_flags > 0)
|
|
fprintf(fp, "\n ");
|
|
if (dp->drcc_flags & DRC_REVERSE)
|
|
fprintf(fp," reverse");
|
|
if (dp->drcc_flags & DRC_BOTHCORNERS)
|
|
fprintf(fp," both-corners");
|
|
if (dp->drcc_flags & DRC_TRIGGER)
|
|
fprintf(fp," trigger");
|
|
if (dp->drcc_flags & DRC_AREA)
|
|
fprintf(fp," area");
|
|
if (dp->drcc_flags & DRC_MAXWIDTH)
|
|
fprintf(fp," maxwidth");
|
|
if (dp->drcc_flags & DRC_BENDS)
|
|
fprintf(fp," bends");
|
|
if (dp->drcc_flags & DRC_RECTSIZE)
|
|
fprintf(fp," rect-size");
|
|
if (dp->drcc_flags & DRC_ANGLES_45)
|
|
fprintf(fp," angles_45");
|
|
if (dp->drcc_flags & DRC_ANGLES_90)
|
|
fprintf(fp," angles_90");
|
|
fprintf(fp,"\n");
|
|
}
|
|
}
|
|
}
|
|
if (gotAny) fprintf(fp,"\n");
|
|
}
|
|
|
|
/* Print out overlaps that are illegal between subcells. */
|
|
|
|
for (i = 0; i < DBNumTypes; i++)
|
|
{
|
|
for (j = 0; j < DBNumTypes; j++)
|
|
{
|
|
if ((i == TT_ERROR_S) || (j == TT_ERROR_S)) continue;
|
|
if (DRCCurStyle->DRCPaintTable[0][i][j] == TT_ERROR_S)
|
|
fprintf(fp, "Tile type %s can't overlap type %s.\n",
|
|
drcGetName(i, buf1), drcGetName(j, buf2));
|
|
}
|
|
}
|
|
|
|
/* Print out tile types that must have exact overlaps. */
|
|
|
|
if (!TTMaskIsZero(&DRCCurStyle->DRCExactOverlapTypes))
|
|
{
|
|
fprintf(fp, "Types that must overlap exactly: %s\n",
|
|
maskToPrint(&DRCCurStyle->DRCExactOverlapTypes));
|
|
}
|
|
}
|
|
|
|
char *
|
|
maskToPrint (mask)
|
|
TileTypeBitMask *mask;
|
|
{
|
|
int i;
|
|
int gotSome = FALSE;
|
|
static char printchain[512];
|
|
char buffer[20], *drcName;
|
|
int bufsize = 511;
|
|
|
|
if (TTMaskIsZero(mask))
|
|
return "<none>";
|
|
|
|
printchain[0] = '\0';
|
|
|
|
for (i = 0; i < DBNumTypes; i++)
|
|
if (TTMaskHasType(mask, i))
|
|
{
|
|
if (gotSome) strncat(printchain, ",", bufsize--);
|
|
else gotSome = TRUE;
|
|
strncat(printchain, drcGetName(i, buffer), bufsize);
|
|
bufsize -= strlen(buffer);
|
|
if (bufsize <= 1)
|
|
{
|
|
printchain[510] = '|';
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (printchain);
|
|
}
|