Merge branch 'work' into tomerge
This commit is contained in:
commit
0944b02f5f
|
|
@ -190,16 +190,22 @@ DBWHLRedraw(rootDef, area, erase)
|
||||||
dbwhlDef = rootDef; /* Must pass to search function. */
|
dbwhlDef = rootDef; /* Must pass to search function. */
|
||||||
dbwhlErase = erase;
|
dbwhlErase = erase;
|
||||||
|
|
||||||
/* If we're passed a NULL area, expand it by one unit so that
|
/* If we're passed a NULL area, expand it by one unit in both
|
||||||
* we're certain to have non-zero area. Otherwise the various
|
* directions so that we're certain to have non-zero area.
|
||||||
* search procedures have big troubles.
|
* Otherwise the various search procedures have big troubles.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ourArea = *area;
|
ourArea = *area;
|
||||||
if (ourArea.r_xbot >= ourArea.r_xtop)
|
if (ourArea.r_xbot >= ourArea.r_xtop)
|
||||||
|
{
|
||||||
ourArea.r_xtop = ourArea.r_xbot + 1;
|
ourArea.r_xtop = ourArea.r_xbot + 1;
|
||||||
|
ourArea.r_xbot--;
|
||||||
|
}
|
||||||
if (ourArea.r_ybot >= ourArea.r_ytop)
|
if (ourArea.r_ybot >= ourArea.r_ytop)
|
||||||
|
{
|
||||||
ourArea.r_ytop = ourArea.r_ybot + 1;
|
ourArea.r_ytop = ourArea.r_ybot + 1;
|
||||||
|
ourArea.r_ybot--;
|
||||||
|
}
|
||||||
(void) WindSearch(DBWclientID, (ClientData) NULL, &ourArea,
|
(void) WindSearch(DBWclientID, (ClientData) NULL, &ourArea,
|
||||||
dbwhlRedrawFunc, (ClientData) &ourArea);
|
dbwhlRedrawFunc, (ClientData) &ourArea);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -879,12 +879,13 @@ efBuildDevice(def, class, type, r, argc, argv)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
efBuildPortNode(def, name, idx, x, y, layername)
|
efBuildPortNode(def, name, idx, x, y, layername, toplevel)
|
||||||
Def *def; /* Def to which this connection is to be added */
|
Def *def; /* Def to which this connection is to be added */
|
||||||
char *name; /* One of the names for this node */
|
char *name; /* One of the names for this node */
|
||||||
int idx; /* Port number (order) */
|
int idx; /* Port number (order) */
|
||||||
int x; int y; /* Location of a point inside this node */
|
int x; int y; /* Location of a point inside this node */
|
||||||
char *layername; /* Name of tile type */
|
char *layername; /* Name of tile type */
|
||||||
|
bool toplevel; /* 1 if the cell def is the top level cell */
|
||||||
{
|
{
|
||||||
HashEntry *he;
|
HashEntry *he;
|
||||||
EFNodeName *nn;
|
EFNodeName *nn;
|
||||||
|
|
@ -902,6 +903,8 @@ efBuildPortNode(def, name, idx, x, y, layername)
|
||||||
if (nn != (EFNodeName *) NULL)
|
if (nn != (EFNodeName *) NULL)
|
||||||
{
|
{
|
||||||
nn->efnn_node->efnode_flags |= EF_PORT;
|
nn->efnn_node->efnode_flags |= EF_PORT;
|
||||||
|
if (toplevel)
|
||||||
|
nn->efnn_node->efnode_flags |= EF_TOP_PORT;
|
||||||
nn->efnn_port = idx;
|
nn->efnn_port = idx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1442,7 +1445,7 @@ efNodeAddName(node, he, hn)
|
||||||
{
|
{
|
||||||
EFNodeName *newnn;
|
EFNodeName *newnn;
|
||||||
EFNodeName *oldnn;
|
EFNodeName *oldnn;
|
||||||
bool topport;
|
bool topport; // New node to add is a top-level port
|
||||||
|
|
||||||
newnn = (EFNodeName *) mallocMagic((unsigned)(sizeof (EFNodeName)));
|
newnn = (EFNodeName *) mallocMagic((unsigned)(sizeof (EFNodeName)));
|
||||||
newnn->efnn_node = node;
|
newnn->efnn_node = node;
|
||||||
|
|
@ -1450,13 +1453,15 @@ efNodeAddName(node, he, hn)
|
||||||
newnn->efnn_port = -1;
|
newnn->efnn_port = -1;
|
||||||
HashSetValue(he, (char *) newnn);
|
HashSetValue(he, (char *) newnn);
|
||||||
|
|
||||||
topport = ((node->efnode_flags & EF_PORT) &&
|
/* If the node is a port of the top level cell, denoted by flag */
|
||||||
(node->efnode_name->efnn_hier->hn_parent == NULL)) ?
|
/* EF_TOP_PORT, then the name given to the port always stays at the */
|
||||||
TRUE : FALSE;
|
/* head of the list. */
|
||||||
|
|
||||||
|
topport = (node->efnode_flags & EF_TOP_PORT) ? TRUE : FALSE;
|
||||||
|
|
||||||
/* Link in the new name */
|
/* Link in the new name */
|
||||||
oldnn = node->efnode_name;
|
oldnn = node->efnode_name;
|
||||||
if (oldnn == NULL || EFHNBest(newnn->efnn_hier, oldnn->efnn_hier) || topport)
|
if (oldnn == NULL || (EFHNBest(newnn->efnn_hier, oldnn->efnn_hier) && !topport))
|
||||||
{
|
{
|
||||||
/* New head of list */
|
/* New head of list */
|
||||||
newnn->efnn_next = oldnn;
|
newnn->efnn_next = oldnn;
|
||||||
|
|
@ -1532,7 +1537,7 @@ efNodeMerge(node1, node2)
|
||||||
/* Make all EFNodeNames point to node1 */
|
/* Make all EFNodeNames point to node1 */
|
||||||
if (node2->efnode_name)
|
if (node2->efnode_name)
|
||||||
{
|
{
|
||||||
bool topport;
|
bool topport1, topport2;
|
||||||
|
|
||||||
for (nn = node2->efnode_name; nn; nn = nn->efnn_next)
|
for (nn = node2->efnode_name; nn; nn = nn->efnn_next)
|
||||||
{
|
{
|
||||||
|
|
@ -1540,13 +1545,12 @@ efNodeMerge(node1, node2)
|
||||||
nn->efnn_node = node1;
|
nn->efnn_node = node1;
|
||||||
}
|
}
|
||||||
|
|
||||||
topport = ((node2->efnode_flags & EF_PORT) &&
|
topport1 = (node1->efnode_flags & EF_TOP_PORT) ? TRUE : FALSE;
|
||||||
(node2->efnode_name->efnn_hier->hn_parent == NULL)) ?
|
topport2 = (node2->efnode_flags & EF_TOP_PORT) ? TRUE : FALSE;
|
||||||
TRUE : FALSE;
|
|
||||||
|
|
||||||
/* Concatenate list of EFNodeNames, taking into account precedence */
|
/* Concatenate list of EFNodeNames, taking into account precedence */
|
||||||
if (topport || EFHNBest(node2->efnode_name->efnn_hier,
|
if (!topport1 && (topport2 || EFHNBest(node2->efnode_name->efnn_hier,
|
||||||
node1->efnode_name->efnn_hier))
|
node1->efnode_name->efnn_hier)))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* New official name is that of node2.
|
* New official name is that of node2.
|
||||||
|
|
|
||||||
|
|
@ -428,7 +428,7 @@ readfile:
|
||||||
def->def_flags |= DEF_SUBCIRCUIT;
|
def->def_flags |= DEF_SUBCIRCUIT;
|
||||||
}
|
}
|
||||||
efBuildPortNode(def, argv[1], atoi(argv[2]), atoi(argv[3]),
|
efBuildPortNode(def, argv[1], atoi(argv[2]), atoi(argv[3]),
|
||||||
atoi(argv[4]), argv[7]);
|
atoi(argv[4]), argv[7], toplevel);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -182,18 +182,22 @@ typedef struct efnhdr
|
||||||
* multiple ports per node (for example, a thru route).
|
* multiple ports per node (for example, a thru route).
|
||||||
*/
|
*/
|
||||||
#define EF_PORT 0x08
|
#define EF_PORT 0x08
|
||||||
|
/*
|
||||||
|
* Flag ports of a top-level cell in addition to setting EF_PORT
|
||||||
|
*/
|
||||||
|
#define EF_TOP_PORT 0x10
|
||||||
/*
|
/*
|
||||||
* This is used when a node is a substrate node with a local
|
* This is used when a node is a substrate node with a local
|
||||||
* node name, making it an implicitly-defined port. It differs
|
* node name, making it an implicitly-defined port. It differs
|
||||||
* from EF_DEVTERM in that EF_DEVTERM includes global substrate
|
* from EF_DEVTERM in that EF_DEVTERM includes global substrate
|
||||||
* nodes, which are not declared ports.
|
* nodes, which are not declared ports.
|
||||||
*/
|
*/
|
||||||
#define EF_SUBS_PORT 0x10
|
#define EF_SUBS_PORT 0x20
|
||||||
/*
|
/*
|
||||||
* EF_SUBS_NODE is defined for substrate nodes defined in the
|
* EF_SUBS_NODE is defined for substrate nodes defined in the
|
||||||
* .ext file.
|
* .ext file.
|
||||||
*/
|
*/
|
||||||
#define EF_SUBS_NODE 0x20
|
#define EF_SUBS_NODE 0x40
|
||||||
|
|
||||||
extern int efNumResistClasses; /* Number of resistance classes in efResists */
|
extern int efNumResistClasses; /* Number of resistance classes in efResists */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue