207 lines
5.0 KiB
C
207 lines
5.0 KiB
C
/*
|
|
* EFsym.c -
|
|
*
|
|
* Procedures for managing symbolic names.
|
|
* Such names are used to assign values to things like transistor dimensions.
|
|
* When an attribute of the form "ext:what=value" is attached to a fet, the
|
|
* corresponding quantity 'what' for that fet is set to 'value'. The 'value'
|
|
* can be symbolic, allowing us to change it during flattening without having
|
|
* to re-extract. The binding between symbolic names and numeric values is
|
|
* set up by calls to efSymAdd(). Recognized values of 'what' are:
|
|
*
|
|
* w, l
|
|
*
|
|
* *********************************************************************
|
|
* * 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/extflat/EFsym.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
|
|
#endif /* not lint */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
|
|
#include "utils/magic.h"
|
|
#include "utils/geometry.h"
|
|
#include "utils/geofast.h"
|
|
#include "utils/hash.h"
|
|
#include "utils/malloc.h"
|
|
#include "utils/utils.h"
|
|
#include "extflat/extflat.h"
|
|
#include "extflat/EFint.h"
|
|
|
|
/* C99 compat */
|
|
#include "textio/textio.h"
|
|
|
|
/* Forward declarations */
|
|
bool efSymAdd();
|
|
|
|
HashTable efSymHash;
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* efSymInit --
|
|
*
|
|
* Initialize the hash table 'efSymHash' used for symbolic name assignments.
|
|
* Called by EFInit().
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* See above.
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
efSymInit()
|
|
{
|
|
HashInit(&efSymHash, 16, HT_STRINGKEYS);
|
|
}
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* efSymAddFile --
|
|
*
|
|
* Read the file 'name' for symbol assignments. Each line of the file
|
|
* should be of the form name=value. We add each symbol 'name' to efSymHash
|
|
* with value 'value'.
|
|
*
|
|
* Results:
|
|
* TRUE on success, FALSE on an error in opening 'name'.
|
|
*
|
|
* Side effects:
|
|
* Adds symbols to the hash table.
|
|
* Complains if we can't open the file or if errors are encountered
|
|
* while reading it.
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
bool
|
|
efSymAddFile(name)
|
|
char *name;
|
|
{
|
|
char line[1024], *cp;
|
|
int lineNum;
|
|
FILE *f;
|
|
|
|
f = fopen(name, "r");
|
|
if (f == NULL)
|
|
{
|
|
perror(name);
|
|
return FALSE;
|
|
}
|
|
|
|
for (lineNum = 1; fgets(line, sizeof line, f); lineNum++)
|
|
{
|
|
if ((cp = strchr(line, '\n')))
|
|
*cp = '\0';
|
|
if (!efSymAdd(line))
|
|
TxError("Error at line %d of %s\n", lineNum, name);
|
|
}
|
|
fclose(f);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* efSymAdd --
|
|
*
|
|
* Given a string of the form name=value, add the symbol 'name' to efSymHash
|
|
* with value 'value'.
|
|
*
|
|
* Results:
|
|
* TRUE normally, FALSE if the input was malformed or resulted in
|
|
* assigning a new value to an existing name.
|
|
*
|
|
* Side effects:
|
|
* Adds a symbol to the hash table.
|
|
* Complains if we have to return FALSE.
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
bool
|
|
efSymAdd(str)
|
|
char *str;
|
|
{
|
|
HashEntry *he;
|
|
char *value;
|
|
|
|
value = strchr(str, '=');
|
|
if (value == NULL)
|
|
{
|
|
TxError("Missing '=' in symbol assignment\n");
|
|
return FALSE;
|
|
}
|
|
|
|
value++;
|
|
if (!StrIsInt(value))
|
|
{
|
|
TxError("Symbol value must be numeric; ignoring \"%s\"\n", str);
|
|
return FALSE;
|
|
}
|
|
|
|
value[-1] = '\0';
|
|
if ((he = HashLookOnly(&efSymHash, str)))
|
|
{
|
|
TxError("Symbol \"%s\" already defined\n", str);
|
|
value[-1] = '=';
|
|
return FALSE;
|
|
}
|
|
|
|
he = HashFind(&efSymHash, str);
|
|
value[-1] = '=';
|
|
HashSetValue(he, (spointertype)atoi(value));
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* efSymLook --
|
|
*
|
|
* Look up the value of a symbol and store the value in *pValue.
|
|
*
|
|
* Results:
|
|
* TRUE if the symbol was defined, FALSE if not.
|
|
*
|
|
* Side effects:
|
|
* See above.
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
bool
|
|
efSymLook(name, pValue)
|
|
char *name;
|
|
int *pValue;
|
|
{
|
|
HashEntry *he;
|
|
|
|
he = HashLookOnly(&efSymHash, name);
|
|
if (he == NULL)
|
|
return FALSE;
|
|
|
|
*pValue = (spointertype) HashGetValue(he);
|
|
return TRUE;
|
|
}
|