|
|
|
@@ -21,6 +21,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h> /* for getenv */
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <strings.h>
|
|
|
|
|
#include <stdarg.h> /* for va_list */
|
|
|
|
|
|
|
|
|
|
#include <tcl.h>
|
|
|
|
|
|
|
|
|
@@ -43,14 +45,14 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
|
|
|
#define FALSE 0
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if TCL_MAJOR_VERSION < 9
|
|
|
|
|
typedef int Tcl_Size;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*-----------------------*/
|
|
|
|
|
/* Tcl 8.4 compatibility */
|
|
|
|
|
/*-----------------------*/
|
|
|
|
|
|
|
|
|
|
#ifndef CONST84
|
|
|
|
|
#define CONST84
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
Tcl_Interp *netgeninterp;
|
|
|
|
|
Tcl_Interp *consoleinterp;
|
|
|
|
|
int ColumnBase = 0;
|
|
|
|
@@ -60,47 +62,47 @@ extern int PropertyErrorDetected;
|
|
|
|
|
|
|
|
|
|
/* Function prototypes for all Tcl command callbacks */
|
|
|
|
|
|
|
|
|
|
int _netgen_readnet(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_readlib(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_canonical(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_writenet(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_flatten(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_nodes(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_elements(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_debug(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_protochip(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_instances(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_contents(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_describe(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_cells(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_ports(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_model(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_leaves(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_quit(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_reinit(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_log(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_readnet(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_readlib(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_canonical(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_writenet(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_flatten(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_nodes(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_elements(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_debug(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_protochip(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_instances(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_contents(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_describe(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_cells(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_ports(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_model(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_leaves(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_quit(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_reinit(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netgen_log(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
#ifdef HAVE_MALLINFO
|
|
|
|
|
int _netgen_printmem(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_printmem(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
#endif
|
|
|
|
|
int _netgen_help(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_matching(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_compare(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_iterate(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_summary(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_print(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_format(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_run(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_verify(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_automorphs(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_equate(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_ignore(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_permute(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_property(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_exhaustive(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_symmetry(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_restart(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_global(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netcmp_convert(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
|
|
|
|
int _netgen_help(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_matching(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_compare(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_iterate(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_summary(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_print(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_format(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_run(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_verify(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_automorphs(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_equate(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_ignore(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_permute(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_property(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_exhaustive(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_symmetry(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_restart(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_global(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
int _netcmp_convert(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
|
|
|
|
|
|
|
|
|
typedef struct _Cmd {
|
|
|
|
|
char *name;
|
|
|
|
@@ -287,7 +289,7 @@ GetTopCell(int fnum)
|
|
|
|
|
int
|
|
|
|
|
CommonGetFilenameOrFile(Tcl_Interp *interp, Tcl_Obj *fobj, int *fnumptr)
|
|
|
|
|
{
|
|
|
|
|
int result, llen;
|
|
|
|
|
int result;
|
|
|
|
|
int fnum, ftest;
|
|
|
|
|
char *filename;
|
|
|
|
|
struct nlist *tp;
|
|
|
|
@@ -370,7 +372,8 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
|
|
|
|
struct nlist **tpr, int *fnumptr)
|
|
|
|
|
{
|
|
|
|
|
Tcl_Obj *tobj, *fobj;
|
|
|
|
|
int result, llen;
|
|
|
|
|
int result;
|
|
|
|
|
Tcl_Size llen;
|
|
|
|
|
int fnum, ftest, index;
|
|
|
|
|
char *filename, *cellname;
|
|
|
|
|
struct nlist *tp, *tp2;
|
|
|
|
@@ -399,7 +402,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
|
|
|
|
Tcl_ResetResult(interp);
|
|
|
|
|
|
|
|
|
|
/* Is 1st argument a special keyword? */
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, tobj, (CONST84 char **)suboptions,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, tobj, (const char **)suboptions,
|
|
|
|
|
"special", 0, &index) == TCL_OK) {
|
|
|
|
|
switch (index) {
|
|
|
|
|
case CIRCUIT1_IDX:
|
|
|
|
@@ -455,7 +458,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
|
|
|
|
|
|
|
|
|
/* Check if 2nd item is a reserved keyword */
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, fobj,
|
|
|
|
|
(CONST84 char **)suboptions,
|
|
|
|
|
(const char **)suboptions,
|
|
|
|
|
"special", 0, &index) == TCL_OK) {
|
|
|
|
|
switch (index) {
|
|
|
|
|
case CIRCUIT1_IDX:
|
|
|
|
@@ -580,7 +583,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
|
|
|
|
} else {
|
|
|
|
|
/* Only one name given; check if it matches subOption */
|
|
|
|
|
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv, (CONST84 char **)suboptions,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv, (const char **)suboptions,
|
|
|
|
|
"special", 0, &index) == TCL_OK) {
|
|
|
|
|
|
|
|
|
|
switch (index) {
|
|
|
|
@@ -665,7 +668,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_canonical(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
int result;
|
|
|
|
|
struct nlist *np;
|
|
|
|
@@ -704,7 +707,7 @@ _netgen_canonical(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_readnet(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *formats[] = {
|
|
|
|
|
"automatic", "ext", "extflat", "sim", "prm", "ntk", "spice",
|
|
|
|
@@ -741,7 +744,7 @@ _netgen_readnet(ClientData clientData,
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
else if (objc > 1) {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)formats,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)formats,
|
|
|
|
|
"format", 0, &index) != TCL_OK) {
|
|
|
|
|
if (objc == 3)
|
|
|
|
|
|
|
|
|
@@ -850,7 +853,7 @@ _netgen_readnet(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_readlib(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *formats[] = {
|
|
|
|
|
"actel", "spice", "xilinx", NULL
|
|
|
|
@@ -883,7 +886,7 @@ _netgen_readlib(ClientData clientData,
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "format [file]");
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)formats,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)formats,
|
|
|
|
|
"format", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -930,7 +933,7 @@ _netgen_readlib(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_writenet(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *formats[] = {
|
|
|
|
|
"ext", "sim", "ntk", "actel",
|
|
|
|
@@ -949,7 +952,7 @@ _netgen_writenet(ClientData clientData,
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "format file");
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)formats,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)formats,
|
|
|
|
|
"format", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -1017,11 +1020,11 @@ _netgen_writenet(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_flatten(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *repstr, *file;
|
|
|
|
|
int result, llen, filenum;
|
|
|
|
|
struct nlist *tp, *tp2;
|
|
|
|
|
int result, filenum;
|
|
|
|
|
struct nlist *tp, *tp2, *tptop;
|
|
|
|
|
|
|
|
|
|
if ((objc < 2) || (objc > 4)) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "?class? valid_cellname");
|
|
|
|
@@ -1035,7 +1038,7 @@ _netgen_flatten(ClientData clientData,
|
|
|
|
|
if (objc >= 3) {
|
|
|
|
|
char *argv = Tcl_GetString(objv[1]);
|
|
|
|
|
if (!strcmp(argv, "class")) {
|
|
|
|
|
tp = GetTopCell(filenum);
|
|
|
|
|
tptop = GetTopCell(filenum);
|
|
|
|
|
|
|
|
|
|
if (objc == 4) {
|
|
|
|
|
int numflat;
|
|
|
|
@@ -1046,7 +1049,7 @@ _netgen_flatten(ClientData clientData,
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
Printf("Flattening instances of %s in cell %s within file %s\n",
|
|
|
|
|
repstr, tp2->name, tp->name);
|
|
|
|
|
repstr, tp2->name, tptop->name);
|
|
|
|
|
numflat = flattenInstancesOf(tp2->name, filenum, repstr);
|
|
|
|
|
if (numflat == 0) {
|
|
|
|
|
Tcl_SetResult(interp, "No instances found to flatten.", NULL);
|
|
|
|
@@ -1055,15 +1058,19 @@ _netgen_flatten(ClientData clientData,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
Printf("Flattening instances of %s in file %s\n", repstr, tp->name);
|
|
|
|
|
Printf("Flattening instances of %s in file %s\n", repstr, tptop->name);
|
|
|
|
|
FlattenInstancesOf(repstr, filenum);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (!strcmp(argv, "prohibit") || !strcmp(argv, "deny")) {
|
|
|
|
|
tp = GetTopCell(filenum);
|
|
|
|
|
Printf("Will not flatten instances of %s in file %s\n", repstr, tp->name);
|
|
|
|
|
/* Mark cell as placeholder so it will not be flattened */
|
|
|
|
|
tp->flags |= CELL_PLACEHOLDER;
|
|
|
|
|
tptop = GetTopCell(filenum);
|
|
|
|
|
if (tp == NULL)
|
|
|
|
|
Printf("Error: Cell %s does not exist.\n", repstr);
|
|
|
|
|
else {
|
|
|
|
|
Printf("Will not flatten instances of %s in file %s\n", repstr, tptop->name);
|
|
|
|
|
/* Mark cell as placeholder so it will not be flattened */
|
|
|
|
|
tp->flags |= CELL_PLACEHOLDER;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "class valid_cellname");
|
|
|
|
@@ -1087,7 +1094,7 @@ _netgen_flatten(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_nodes(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *estr = NULL, *istr = NULL, *cstr, *fstr;
|
|
|
|
|
char *optstart;
|
|
|
|
@@ -1205,7 +1212,7 @@ _netgen_nodes(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_elements(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *nstr = NULL, *cstr;
|
|
|
|
|
struct objlist * (*ListSave)();
|
|
|
|
@@ -1300,7 +1307,7 @@ _netgen_elements(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_debug(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *yesno[] = {
|
|
|
|
|
"on", "off", NULL
|
|
|
|
@@ -1314,7 +1321,7 @@ _netgen_debug(ClientData clientData,
|
|
|
|
|
if (objc == 1)
|
|
|
|
|
index = YES_IDX;
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)yesno,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)yesno,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
index = CMD_IDX;
|
|
|
|
|
}
|
|
|
|
@@ -1349,7 +1356,7 @@ _netgen_debug(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_protochip(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
if (objc != 1) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
|
|
|
@@ -1369,7 +1376,7 @@ _netgen_protochip(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_instances(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *repstr;
|
|
|
|
|
int result;
|
|
|
|
@@ -1399,7 +1406,7 @@ _netgen_instances(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_contents(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *repstr;
|
|
|
|
|
int result;
|
|
|
|
@@ -1428,7 +1435,7 @@ _netgen_contents(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_describe(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *repstr;
|
|
|
|
|
int file = -1;
|
|
|
|
@@ -1458,7 +1465,7 @@ _netgen_describe(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_cells(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *repstr, *filename = NULL;
|
|
|
|
|
char *optstart;
|
|
|
|
@@ -1545,7 +1552,7 @@ _netgen_cells(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_model(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
struct nlist *tp, *tp2;
|
|
|
|
|
char *model, *retclass;
|
|
|
|
@@ -1597,7 +1604,7 @@ _netgen_model(ClientData clientData,
|
|
|
|
|
if (objc == 3) {
|
|
|
|
|
nports = NumberOfPorts(tp->name, fnum);
|
|
|
|
|
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[2], (CONST84 char **)modelclasses,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[2], (const char **)modelclasses,
|
|
|
|
|
"class", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -1767,7 +1774,7 @@ wrongNumPorts:
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_ports(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *repstr;
|
|
|
|
|
int result;
|
|
|
|
@@ -1797,7 +1804,7 @@ _netgen_ports(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_leaves(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *repstr;
|
|
|
|
|
int result;
|
|
|
|
@@ -1833,7 +1840,7 @@ _netgen_leaves(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_quit(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
if (objc != 1) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
|
|
|
@@ -1861,7 +1868,7 @@ _netgen_quit(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_reinit(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
if (objc != 1) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
|
|
|
@@ -1881,7 +1888,7 @@ _netgen_reinit(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_log(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *yesno[] = {
|
|
|
|
|
"start", "end", "reset", "suspend", "resume", "file", "echo", "put", NULL
|
|
|
|
@@ -1898,7 +1905,7 @@ _netgen_log(ClientData clientData,
|
|
|
|
|
index = (LoggingFile) ? RESUME_IDX : START_IDX;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)yesno,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)yesno,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -2025,7 +2032,7 @@ _netgen_log(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_printmem(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
if (objc != 1) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
|
|
|
@@ -2047,7 +2054,7 @@ _netgen_printmem(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_format(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
int col1_width = 41, col2_width = 41;
|
|
|
|
|
|
|
|
|
@@ -2108,13 +2115,13 @@ _netcmp_format(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_compare(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *name1, *name2, *file1, *file2, *optstart;
|
|
|
|
|
int fnum1, fnum2, dolist = 0;
|
|
|
|
|
int dohierarchy = FALSE;
|
|
|
|
|
int assignonly = FALSE;
|
|
|
|
|
int argstart = 1, qresult, llen, result;
|
|
|
|
|
int argstart = 1, qresult, result;
|
|
|
|
|
int hascontents1, hascontents2;
|
|
|
|
|
struct Correspond *nextcomp;
|
|
|
|
|
struct nlist *tp1 = NULL, *tp2 = NULL;
|
|
|
|
@@ -2285,7 +2292,7 @@ _netcmp_compare(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_iterate(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
if (objc != 1) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
|
|
|
@@ -2309,7 +2316,7 @@ _netcmp_iterate(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_summary(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *options[] = {
|
|
|
|
|
"nodes", "elements", NULL
|
|
|
|
@@ -2324,7 +2331,7 @@ _netcmp_summary(ClientData clientData,
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
if (objc == 2) {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -2350,7 +2357,7 @@ _netcmp_summary(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_print(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *options[] = {
|
|
|
|
|
"nodes", "elements", "queue", NULL
|
|
|
|
@@ -2388,16 +2395,16 @@ _netcmp_print(ClientData clientData,
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
if (objc >= 2) {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
if ((objc == 2) && (Tcl_GetIndexFromObj(interp, objv[1],
|
|
|
|
|
(CONST84 char **)classes, "class", 0, &class) != TCL_OK)) {
|
|
|
|
|
(const char **)classes, "class", 0, &class) != TCL_OK)) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (objc == 3 && index != QUEUE_IDX) {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[2], (CONST84 char **)classes,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[2], (const char **)classes,
|
|
|
|
|
"class", 0, &class) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -2441,7 +2448,7 @@ _netcmp_print(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_run(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *options[] = {
|
|
|
|
|
"converge", "resolve", NULL
|
|
|
|
@@ -2468,7 +2475,7 @@ _netcmp_run(ClientData clientData,
|
|
|
|
|
if (objc == 1)
|
|
|
|
|
index = RESOLVE_IDX;
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -2585,7 +2592,7 @@ _netcmp_run(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_verify(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *options[] = {
|
|
|
|
|
"nodes", "elements", "properties", "only", "all", "equivalent", "unique", NULL
|
|
|
|
@@ -2617,7 +2624,7 @@ _netcmp_verify(ClientData clientData,
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
if (objc == 2) {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -2774,7 +2781,7 @@ _netcmp_verify(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_automorphs(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
if (objc != 1) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
|
|
|
@@ -2795,7 +2802,7 @@ _netcmp_automorphs(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_convert(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *cellname;
|
|
|
|
|
int filenum = -1;
|
|
|
|
@@ -2825,10 +2832,10 @@ _netcmp_convert(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_global(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *filename, *cellname, *pattern;
|
|
|
|
|
int numchanged = 0, p, fnum, llen, result;
|
|
|
|
|
int numchanged = 0, p, fnum, result;
|
|
|
|
|
struct nlist *tp;
|
|
|
|
|
|
|
|
|
|
if (objc < 2) {
|
|
|
|
@@ -2862,7 +2869,7 @@ _netcmp_global(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_ignore(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *options[] = {
|
|
|
|
|
"class", "shorted", NULL
|
|
|
|
@@ -2876,7 +2883,7 @@ _netcmp_ignore(ClientData clientData,
|
|
|
|
|
char *name = NULL, *name2 = NULL;
|
|
|
|
|
|
|
|
|
|
if (objc >= 3) {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
|
|
|
|
"option", 0, &index) == TCL_OK) {
|
|
|
|
|
objc--;
|
|
|
|
|
objv++;
|
|
|
|
@@ -2910,7 +2917,7 @@ _netcmp_ignore(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_equate(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *options[] = {
|
|
|
|
|
"nodes", "elements", "classes", "pins", NULL
|
|
|
|
@@ -2925,7 +2932,8 @@ _netcmp_equate(ClientData clientData,
|
|
|
|
|
struct ElementClass *saveEclass = NULL;
|
|
|
|
|
struct NodeClass *saveNclass = NULL;
|
|
|
|
|
int file1, file2;
|
|
|
|
|
int i, l1, l2, ltest, lent, dolist = 0, doforce = 0, dounique = 0;
|
|
|
|
|
int i, dolist = 0, doforce = 0, dounique = 0;
|
|
|
|
|
Tcl_Size l1, l2, lent, ltest;
|
|
|
|
|
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
|
|
|
|
|
|
|
|
|
while (objc > 1) {
|
|
|
|
@@ -2955,7 +2963,7 @@ _netcmp_equate(ClientData clientData,
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -3424,12 +3432,13 @@ _netcmp_equate(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_property(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
int fnum, i, llen;
|
|
|
|
|
int fnum, i;
|
|
|
|
|
struct nlist *tp;
|
|
|
|
|
struct property *kl, *kllast, *klnext;
|
|
|
|
|
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
|
|
|
|
Tcl_Size llen;
|
|
|
|
|
double dval;
|
|
|
|
|
int ival, argstart;
|
|
|
|
|
|
|
|
|
@@ -3506,7 +3515,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
/* Don't need to check return value */
|
|
|
|
|
index = -1;
|
|
|
|
|
Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)topoptions,
|
|
|
|
|
Tcl_GetIndexFromObj(interp, objv[1], (const char **)topoptions,
|
|
|
|
|
"option", 0, &index);
|
|
|
|
|
|
|
|
|
|
/* Check for special command "property default" */
|
|
|
|
@@ -3604,7 +3613,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
}
|
|
|
|
|
else if (objc == 3) {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[2],
|
|
|
|
|
(CONST84 char **)topo,
|
|
|
|
|
(const char **)topo,
|
|
|
|
|
"topology", 0, &idx2) == TCL_OK) {
|
|
|
|
|
if (idx2 == 0)
|
|
|
|
|
ExactTopology = TRUE;
|
|
|
|
@@ -3663,7 +3672,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
Tcl_SetObjResult(interp, tobj1);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[2], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[2], (const char **)options,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
index = ADD_IDX;
|
|
|
|
|
argstart = 2;
|
|
|
|
@@ -3696,7 +3705,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
// Each value must be a list of two, or a yes/no answer.
|
|
|
|
|
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[i],
|
|
|
|
|
(CONST84 char **)yesno,
|
|
|
|
|
(const char **)yesno,
|
|
|
|
|
"combine", 0, &idx2) == TCL_OK) {
|
|
|
|
|
if (idx2 <= 4) { /* true, enable, etc. */
|
|
|
|
|
if (index == SERIAL_IDX || index == SERIES_IDX)
|
|
|
|
@@ -3728,7 +3737,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
if (result != TCL_OK) return result;
|
|
|
|
|
|
|
|
|
|
result = Tcl_GetIndexFromObj(interp, tobj2,
|
|
|
|
|
(CONST84 char **)combineoptions,
|
|
|
|
|
(const char **)combineoptions,
|
|
|
|
|
"combine_type", 0, &idx2);
|
|
|
|
|
if (result != TCL_OK) return result;
|
|
|
|
|
|
|
|
|
@@ -3813,7 +3822,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
/* {key, type} or {key, tolerance} duplet */
|
|
|
|
|
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, tobj2,
|
|
|
|
|
(CONST84 char **)suboptions,
|
|
|
|
|
(const char **)suboptions,
|
|
|
|
|
"type", 0, &idx2) != TCL_OK) {
|
|
|
|
|
Tcl_ResetResult(interp);
|
|
|
|
|
if (Tcl_GetDoubleFromObj(interp, tobj2, &dval)
|
|
|
|
@@ -3857,7 +3866,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
/* {key, type, tolerance} triplet */
|
|
|
|
|
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, tobj2,
|
|
|
|
|
(CONST84 char **)suboptions,
|
|
|
|
|
(const char **)suboptions,
|
|
|
|
|
"type", 0, &idx2) != TCL_OK)
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
|
|
|
|
@@ -4000,7 +4009,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
if (result != TCL_OK) return result;
|
|
|
|
|
|
|
|
|
|
result = Tcl_GetIndexFromObj(interp, tobj2,
|
|
|
|
|
(CONST84 char **)mergeoptions,
|
|
|
|
|
(const char **)mergeoptions,
|
|
|
|
|
"merge_type", 0, &idx2);
|
|
|
|
|
if (result != TCL_OK) return result;
|
|
|
|
|
|
|
|
|
@@ -4052,7 +4061,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
result = Tcl_GetIndexFromObj(interp, objv[3],
|
|
|
|
|
(CONST84 char **)deriveoptions,
|
|
|
|
|
(const char **)deriveoptions,
|
|
|
|
|
"area|perimeter", 0, &idx2);
|
|
|
|
|
if (result != TCL_OK) return result;
|
|
|
|
|
switch (idx2) {
|
|
|
|
@@ -4084,7 +4093,7 @@ _netcmp_property(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_permute(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *model, *pin1, *pin2;
|
|
|
|
|
char *permuteclass[] = {
|
|
|
|
@@ -4105,7 +4114,7 @@ _netcmp_permute(ClientData clientData,
|
|
|
|
|
index = DEFLT_IDX;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)permuteclass,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)permuteclass,
|
|
|
|
|
"permute class", 0, &index) != TCL_OK) {
|
|
|
|
|
if (objc != 4) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "?valid_cellname pin1 pin2?");
|
|
|
|
@@ -4225,7 +4234,7 @@ _netcmp_permute(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_symmetry(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
Printf("Symmetry breaking method has been deprecated.\n");
|
|
|
|
|
return TCL_OK;
|
|
|
|
@@ -4241,7 +4250,7 @@ _netcmp_symmetry(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_exhaustive(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *yesno[] = {
|
|
|
|
|
"on", "off", NULL
|
|
|
|
@@ -4254,7 +4263,7 @@ _netcmp_exhaustive(ClientData clientData,
|
|
|
|
|
if (objc == 1)
|
|
|
|
|
index = -1;
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)yesno,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)yesno,
|
|
|
|
|
"option", 0, &index) != TCL_OK)
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -4283,7 +4292,7 @@ _netcmp_exhaustive(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_restart(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
if (objc != 1) {
|
|
|
|
|
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
|
|
|
@@ -4303,7 +4312,7 @@ _netcmp_restart(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netgen_help(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
int n;
|
|
|
|
|
|
|
|
|
@@ -4334,7 +4343,7 @@ _netgen_help(ClientData clientData,
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_netcmp_matching(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
char *options[] = {
|
|
|
|
|
"nodes", "elements", NULL
|
|
|
|
@@ -4356,7 +4365,7 @@ _netcmp_matching(ClientData clientData,
|
|
|
|
|
name = Tcl_GetString(objv[1]);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
|
|
|
|
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
|
|
|
|
"option", 0, &index) != TCL_OK) {
|
|
|
|
|
return TCL_ERROR;
|
|
|
|
|
}
|
|
|
|
@@ -4485,14 +4494,14 @@ void tcl_vprintf(FILE *f, const char *fmt, va_list args_in)
|
|
|
|
|
|
|
|
|
|
void tcl_stdflush(FILE *f)
|
|
|
|
|
{
|
|
|
|
|
Tcl_SavedResult state;
|
|
|
|
|
Tcl_InterpState state;
|
|
|
|
|
static char stdstr[] = "::flush stdxxx";
|
|
|
|
|
char *stdptr = stdstr + 11;
|
|
|
|
|
|
|
|
|
|
Tcl_SaveResult(netgeninterp, &state);
|
|
|
|
|
state = Tcl_SaveInterpState(netgeninterp, TCL_OK);
|
|
|
|
|
strcpy(stdptr, (f == stderr) ? "err" : "out");
|
|
|
|
|
Tcl_Eval(netgeninterp, stdstr);
|
|
|
|
|
Tcl_RestoreResult(netgeninterp, &state);
|
|
|
|
|
Tcl_RestoreInterpState(netgeninterp, state);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------*/
|
|
|
|
@@ -4522,7 +4531,7 @@ char *Tcl_Strdup(const char *s)
|
|
|
|
|
/*------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
int _tkcon_interrupt(ClientData clientData,
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
|
|
|
|
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
|
|
|
|
{
|
|
|
|
|
InterruptPending = 1;
|
|
|
|
|
return TCL_OK;
|
|
|
|
@@ -4561,7 +4570,7 @@ int Tclnetgen_Init(Tcl_Interp *interp)
|
|
|
|
|
/* Remember the interpreter */
|
|
|
|
|
netgeninterp = interp;
|
|
|
|
|
|
|
|
|
|
if (Tcl_InitStubs(interp, "8.5", 0) == NULL) return TCL_ERROR;
|
|
|
|
|
if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL) return TCL_ERROR;
|
|
|
|
|
|
|
|
|
|
for (n = 0; netgen_cmds[n].name != NULL; n++) {
|
|
|
|
|
sprintf(keyword, "netgen::%s", netgen_cmds[n].name);
|
|
|
|
@@ -4570,7 +4579,8 @@ int Tclnetgen_Init(Tcl_Interp *interp)
|
|
|
|
|
}
|
|
|
|
|
for (n = 0; netcmp_cmds[n].name != NULL; n++) {
|
|
|
|
|
sprintf(keyword, "netgen::%s", netcmp_cmds[n].name);
|
|
|
|
|
Tcl_CreateObjCommand(interp, keyword, netcmp_cmds[n].handler,
|
|
|
|
|
Tcl_CreateObjCommand(interp, keyword,
|
|
|
|
|
(Tcl_ObjCmdProc *)netcmp_cmds[n].handler,
|
|
|
|
|
(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|