Files
magic/drc/DRCprint.c
T
Tim Edwards 60a378842f Corrected one array overrun error caused by using the command
"drc printrules".  Implemented a new "drc" command option called
"drc ignore", which can be used to suppress reporting of specific
rules, for both "drc why" and "drc find".  This can help with
finding an error buried among a large number of other errors.
2023-06-26 20:47:37 -04:00

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);
}