mirror of
https://github.com/RTimothyEdwards/magic.git
synced 2026-08-22 14:17:43 +02:00
Initial commit at Tue Apr 25 08:41:48 EDT 2017 by tim on stravinsky
This commit is contained in:
+203
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
* 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"
|
||||
|
||||
/* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user