Compare commits
7 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
d9e6c78adb | |
|
|
d8580be739 | |
|
|
1a16502a69 | |
|
|
5ecf10c022 | |
|
|
e366cf6a4c | |
|
|
7ecebb5dd6 | |
|
|
099d513011 |
|
|
@ -2324,7 +2324,7 @@ CmdDoProperty(
|
||||||
TxCommand *cmd,
|
TxCommand *cmd,
|
||||||
int argstart)
|
int argstart)
|
||||||
{
|
{
|
||||||
PropertyRecord *proprec;
|
PropertyRecord *proprec = NULL;
|
||||||
char *value;
|
char *value;
|
||||||
bool propfound, dolist;
|
bool propfound, dolist;
|
||||||
int proptype, proplen, propvalue, i;
|
int proptype, proplen, propvalue, i;
|
||||||
|
|
@ -2662,31 +2662,31 @@ CmdDoProperty(
|
||||||
* the valid number of arguments, then again to parse the
|
* the valid number of arguments, then again to parse the
|
||||||
* values, once the property record has been allocated
|
* values, once the property record has been allocated
|
||||||
*/
|
*/
|
||||||
if (proptype == PROPERTY_TYPE_PLANE)
|
value = cmd->tx_argv[argstart + 1];
|
||||||
|
for (proplen = 0; *value != '\0'; )
|
||||||
{
|
{
|
||||||
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord));
|
if (isspace(*value) && (*value != '\0')) value++;
|
||||||
plane = DBNewPlane((ClientData)TT_SPACE);
|
if (!isspace(*value))
|
||||||
proprec->prop_value.prop_plane = plane;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value = cmd->tx_argv[argstart + 1];
|
|
||||||
for (proplen = 0; *value != '\0'; )
|
|
||||||
{
|
{
|
||||||
if (isspace(*value) && (*value != '\0')) value++;
|
proplen++;
|
||||||
if (!isspace(*value))
|
while (!isspace(*value) && (*value != '\0')) value++;
|
||||||
{
|
|
||||||
proplen++;
|
|
||||||
while (!isspace(*value) && (*value != '\0')) value++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (proplen > 0)
|
}
|
||||||
|
if (proplen > 0)
|
||||||
|
{
|
||||||
|
if (proptype == PROPERTY_TYPE_PLANE)
|
||||||
|
{
|
||||||
|
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord));
|
||||||
|
plane = DBNewPlane((ClientData)TT_SPACE);
|
||||||
|
proprec->prop_value.prop_plane = plane;
|
||||||
|
} else {
|
||||||
proprec = (PropertyRecord *)mallocMagic(
|
proprec = (PropertyRecord *)mallocMagic(
|
||||||
sizeof(PropertyRecord) +
|
sizeof(PropertyRecord) +
|
||||||
(proplen - 2) * sizeof(int));
|
(proplen - 2) * sizeof(int));
|
||||||
|
}
|
||||||
|
proprec->prop_type = proptype;
|
||||||
|
proprec->prop_len = proplen;
|
||||||
}
|
}
|
||||||
proprec->prop_type = proptype;
|
|
||||||
proprec->prop_len = proplen;
|
|
||||||
|
|
||||||
/* Second pass */
|
/* Second pass */
|
||||||
value = cmd->tx_argv[argstart + 1];
|
value = cmd->tx_argv[argstart + 1];
|
||||||
|
|
|
||||||
|
|
@ -647,6 +647,9 @@ cmdSelectArea(
|
||||||
if (!(crec->dbw_flags & DBW_SEELABELS)) TTMaskClearType(&mask, L_LABEL);
|
if (!(crec->dbw_flags & DBW_SEELABELS)) TTMaskClearType(&mask, L_LABEL);
|
||||||
if (!(crec->dbw_flags & DBW_SEECELLS)) TTMaskClearType(&mask, L_CELL);
|
if (!(crec->dbw_flags & DBW_SEECELLS)) TTMaskClearType(&mask, L_CELL);
|
||||||
}
|
}
|
||||||
|
else if (option == SEL_AREA)
|
||||||
|
TTMaskSetType(&mask, L_LABEL);
|
||||||
|
|
||||||
SelectArea(&scx, &mask, crec->dbw_bitmask, globmatch);
|
SelectArea(&scx, &mask, crec->dbw_bitmask, globmatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ ResNewSDDevice(tile, tp, xj, yj, direction, PendingList)
|
||||||
int xj, yj, direction;
|
int xj, yj, direction;
|
||||||
resNode **PendingList;
|
resNode **PendingList;
|
||||||
{
|
{
|
||||||
resNode *resptr;
|
resNode *resptr = NULL;
|
||||||
resDevice *resDev;
|
resDevice *resDev;
|
||||||
tElement *tcell;
|
tElement *tcell;
|
||||||
int newnode;
|
int newnode;
|
||||||
|
|
@ -64,7 +64,8 @@ ResNewSDDevice(tile, tp, xj, yj, direction, PendingList)
|
||||||
|
|
||||||
ri = (resInfo *) TiGetClientPTR(tp);
|
ri = (resInfo *) TiGetClientPTR(tp);
|
||||||
resDev = ri->deviceList;
|
resDev = ri->deviceList;
|
||||||
if ((ri->sourceEdge & direction) != 0)
|
if ((((ri->sourceEdge & direction) != 0) && (resDev->rd_nterms == 4))
|
||||||
|
|| (resDev->rd_nterms > 2))
|
||||||
{
|
{
|
||||||
if (resDev->rd_fet_source == (resNode *) NULL)
|
if (resDev->rd_fet_source == (resNode *) NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -73,11 +74,9 @@ ResNewSDDevice(tile, tp, xj, yj, direction, PendingList)
|
||||||
resDev->rd_fet_source = resptr;
|
resDev->rd_fet_source = resptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
resptr = resDev->rd_fet_source;
|
resptr = resDev->rd_fet_source;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else if (resDev->rd_nterms > 3)
|
||||||
{
|
{
|
||||||
if (resDev->rd_fet_drain == (resNode *) NULL)
|
if (resDev->rd_fet_drain == (resNode *) NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -86,9 +85,7 @@ ResNewSDDevice(tile, tp, xj, yj, direction, PendingList)
|
||||||
resDev->rd_fet_drain = resptr;
|
resDev->rd_fet_drain = resptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
resptr = resDev->rd_fet_drain;
|
resptr = resDev->rd_fet_drain;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (newnode)
|
if (newnode)
|
||||||
{
|
{
|
||||||
|
|
@ -99,7 +96,10 @@ ResNewSDDevice(tile, tp, xj, yj, direction, PendingList)
|
||||||
resptr->rn_te = tcell;
|
resptr->rn_te = tcell;
|
||||||
ResAddToQueue(resptr, PendingList);
|
ResAddToQueue(resptr, PendingList);
|
||||||
}
|
}
|
||||||
NEWBREAK(resptr, tile, xj, yj, NULL);
|
if (resptr != NULL)
|
||||||
|
{
|
||||||
|
NEWBREAK(resptr, tile, xj, yj, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -131,20 +131,14 @@ ResNewSubDevice(tile, tp, xj, yj, direction, PendingList)
|
||||||
ri = (resInfo *) TiGetClientPTR(tp);
|
ri = (resInfo *) TiGetClientPTR(tp);
|
||||||
resDev = ri->deviceList;
|
resDev = ri->deviceList;
|
||||||
|
|
||||||
/* Arrived at a device that has a terminal connected to substrate */
|
if (resDev->rd_fet_subs == (resNode *)NULL)
|
||||||
/* that is not a FET bulk terminal (e.g., varactor, diode). */
|
|
||||||
if (resDev->rd_nterms < 4) return;
|
|
||||||
|
|
||||||
if (resDev->rd_fet_subs == (resNode *) NULL)
|
|
||||||
{
|
{
|
||||||
resptr = (resNode *) mallocMagic((unsigned)(sizeof(resNode)));
|
resptr = (resNode *) mallocMagic((unsigned)(sizeof(resNode)));
|
||||||
newnode = TRUE;
|
newnode = TRUE;
|
||||||
resDev->rd_fet_subs = resptr;
|
resDev->rd_fet_subs = resptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
resptr = resDev->rd_fet_subs;
|
||||||
resptr = resDev->rd_fet_subs;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newnode)
|
if (newnode)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -449,6 +449,7 @@ ResFindNewContactTiles(contacts)
|
||||||
|
|
||||||
tile = PlaneGetHint(ResDef->cd_planes[pNum]);
|
tile = PlaneGetHint(ResDef->cd_planes[pNum]);
|
||||||
GOTOPOINT(tile, &(contacts->cp_center));
|
GOTOPOINT(tile, &(contacts->cp_center));
|
||||||
|
PlaneSetHint(ResDef->cd_planes[pNum], tile);
|
||||||
#ifdef PARANOID
|
#ifdef PARANOID
|
||||||
if (tile == (Tile *) NULL)
|
if (tile == (Tile *) NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -1412,6 +1413,7 @@ FindStartTile(resisdata, SourcePoint)
|
||||||
{
|
{
|
||||||
tile = PlaneGetHint(ResUse->cu_def->cd_planes[pnum]);
|
tile = PlaneGetHint(ResUse->cu_def->cd_planes[pnum]);
|
||||||
GOTOPOINT(tile, &workingPoint);
|
GOTOPOINT(tile, &workingPoint);
|
||||||
|
PlaneSetHint(ResUse->cu_def->cd_planes[pnum], tile);
|
||||||
SourcePoint->p_x = workingPoint.p_x;
|
SourcePoint->p_x = workingPoint.p_x;
|
||||||
SourcePoint->p_y = workingPoint.p_y;
|
SourcePoint->p_y = workingPoint.p_y;
|
||||||
|
|
||||||
|
|
@ -1445,6 +1447,7 @@ FindStartTile(resisdata, SourcePoint)
|
||||||
|
|
||||||
tile = PlaneGetHint(ResUse->cu_def->cd_planes[pnum]);
|
tile = PlaneGetHint(ResUse->cu_def->cd_planes[pnum]);
|
||||||
GOTOPOINT(tile, &workingPoint);
|
GOTOPOINT(tile, &workingPoint);
|
||||||
|
PlaneSetHint(ResUse->cu_def->cd_planes[pnum], tile);
|
||||||
|
|
||||||
if (IsSplit(tile))
|
if (IsSplit(tile))
|
||||||
{
|
{
|
||||||
|
|
@ -1796,6 +1799,7 @@ ResGetDevice(pt, type)
|
||||||
|
|
||||||
tile = PlaneGetHint(ResUse->cu_def->cd_planes[pnum]);
|
tile = PlaneGetHint(ResUse->cu_def->cd_planes[pnum]);
|
||||||
GOTOPOINT(tile, &workingPoint);
|
GOTOPOINT(tile, &workingPoint);
|
||||||
|
PlaneSetHint(ResUse->cu_def->cd_planes[pnum], tile);
|
||||||
|
|
||||||
const ClientData ticlient = TiGetClient(tile);
|
const ClientData ticlient = TiGetClient(tile);
|
||||||
if (IsSplit(tile))
|
if (IsSplit(tile))
|
||||||
|
|
|
||||||
|
|
@ -76,10 +76,9 @@ ResCalcTileResistance(tile, info, pendingList, doneList)
|
||||||
if (x < MinX) MinX = x;
|
if (x < MinX) MinX = x;
|
||||||
if (y > MaxY) MaxY = y;
|
if (y > MaxY) MaxY = y;
|
||||||
if (y < MinY) MinY = y;
|
if (y < MinY) MinY = y;
|
||||||
|
|
||||||
if (p1->br_this->rn_why == RES_NODE_DEVICE)
|
if (p1->br_this->rn_why == RES_NODE_DEVICE)
|
||||||
{
|
|
||||||
device = TRUE;
|
device = TRUE;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finally, produce resistors for partition. Keep track of */
|
/* Finally, produce resistors for partition. Keep track of */
|
||||||
|
|
@ -248,7 +247,7 @@ ResCalcEastWest(tile, pendingList, doneList, resList)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p3 = p2->br_next;
|
p3 = p2->br_next;
|
||||||
while (p3 != NULL)
|
while (p3 != NULL)
|
||||||
{
|
{
|
||||||
if (p3->br_this == currNode)
|
if (p3->br_this == currNode)
|
||||||
|
|
@ -413,32 +412,32 @@ ResCalcNorthSouth(tile, pendingList, doneList, resList)
|
||||||
{
|
{
|
||||||
if (p2->br_this == p1->br_this)
|
if (p2->br_this == p1->br_this)
|
||||||
{
|
{
|
||||||
currNode = NULL;
|
currNode = NULL;
|
||||||
p1->br_next = p2->br_next;
|
p1->br_next = p2->br_next;
|
||||||
freeMagic((char *)p2);
|
freeMagic((char *)p2);
|
||||||
p2 = p1;
|
p2 = p1;
|
||||||
}
|
}
|
||||||
else if (p2->br_this == resCurrentNode)
|
else if (p2->br_this == resCurrentNode)
|
||||||
{
|
{
|
||||||
currNode = p1->br_this;
|
currNode = p1->br_this;
|
||||||
ResMergeNodes(p2->br_this, p1->br_this, pendingList, doneList);
|
ResMergeNodes(p2->br_this, p1->br_this, pendingList, doneList);
|
||||||
freeMagic((char *)p1);
|
freeMagic((char *)p1);
|
||||||
merged = TRUE;
|
merged = TRUE;
|
||||||
}
|
}
|
||||||
else if (p1->br_this == resCurrentNode)
|
else if (p1->br_this == resCurrentNode)
|
||||||
{
|
{
|
||||||
currNode = p2->br_this;
|
currNode = p2->br_this;
|
||||||
p1->br_next = p2->br_next;
|
p1->br_next = p2->br_next;
|
||||||
ResMergeNodes(p1->br_this, p2->br_this, pendingList, doneList);
|
ResMergeNodes(p1->br_this, p2->br_this, pendingList, doneList);
|
||||||
merged = TRUE;
|
merged = TRUE;
|
||||||
freeMagic((char *)p2);
|
freeMagic((char *)p2);
|
||||||
p2 = p1;
|
p2 = p1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
currNode = p1->br_this;
|
currNode = p1->br_this;
|
||||||
ResMergeNodes(p2->br_this, p1->br_this, pendingList, doneList);
|
ResMergeNodes(p2->br_this, p1->br_this, pendingList, doneList);
|
||||||
freeMagic((char *)p1);
|
freeMagic((char *)p1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -559,7 +558,7 @@ ResCalcNearDevice(tile, pendingList, doneList, resList)
|
||||||
* breakpoint, then return.
|
* breakpoint, then return.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (info->breakList->br_next == NULL)
|
if (info->breakList->br_next == NULL)
|
||||||
{
|
{
|
||||||
freeMagic((char *)info->breakList);
|
freeMagic((char *)info->breakList);
|
||||||
info->breakList = NULL;
|
info->breakList = NULL;
|
||||||
|
|
|
||||||
|
|
@ -839,9 +839,9 @@ ResTriangleCheck(resptr)
|
||||||
*
|
*
|
||||||
* ResMergeNodes--
|
* ResMergeNodes--
|
||||||
*
|
*
|
||||||
* results: none
|
* Results: none
|
||||||
*
|
*
|
||||||
* side effects: appends all the cElement, jElement, tElement and
|
* Side Effects: appends all the cElement, jElement, tElement and
|
||||||
* resElement structures from node 2 onto node 1. Node 2 is
|
* resElement structures from node 2 onto node 1. Node 2 is
|
||||||
* then eliminated.
|
* then eliminated.
|
||||||
*
|
*
|
||||||
|
|
@ -1010,7 +1010,7 @@ ResMergeNodes(node1, node2, pendingList, doneList)
|
||||||
* ResDeleteResPointer-- Deletes the pointer from a node to a resistor.
|
* ResDeleteResPointer-- Deletes the pointer from a node to a resistor.
|
||||||
* Used when a resistor is deleted.
|
* Used when a resistor is deleted.
|
||||||
*
|
*
|
||||||
* Results:none
|
* Results: none
|
||||||
*
|
*
|
||||||
* Side Effects: Modifies a node's resistor list.
|
* Side Effects: Modifies a node's resistor list.
|
||||||
*
|
*
|
||||||
|
|
@ -1018,7 +1018,7 @@ ResMergeNodes(node1, node2, pendingList, doneList)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
ResDeleteResPointer(node,resistor)
|
ResDeleteResPointer(node, resistor)
|
||||||
resNode *node;
|
resNode *node;
|
||||||
resResistor *resistor;
|
resResistor *resistor;
|
||||||
|
|
||||||
|
|
@ -1059,7 +1059,7 @@ ResDeleteResPointer(node,resistor)
|
||||||
*
|
*
|
||||||
* ResEliminateResistor--
|
* ResEliminateResistor--
|
||||||
*
|
*
|
||||||
* Results:none
|
* Results: none
|
||||||
*
|
*
|
||||||
* Side Effects: Deletes a resistor. Does not delete pointers from nodes to
|
* Side Effects: Deletes a resistor. Does not delete pointers from nodes to
|
||||||
* resistor.
|
* resistor.
|
||||||
|
|
@ -1097,8 +1097,7 @@ ResEliminateResistor(resistor, homelist)
|
||||||
* they are no longer needed. If the 'info' option is used,
|
* they are no longer needed. If the 'info' option is used,
|
||||||
* the node is eradicated.
|
* the node is eradicated.
|
||||||
*
|
*
|
||||||
* Results:
|
* Results: none.
|
||||||
* None.
|
|
||||||
*
|
*
|
||||||
* Side Effects: frees memory
|
* Side Effects: frees memory
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -1356,7 +1356,7 @@ ResFixUpConnections(extDev, layoutDev, extNode, nodename)
|
||||||
}
|
}
|
||||||
if (extDev->subs == extNode)
|
if (extDev->subs == extNode)
|
||||||
{
|
{
|
||||||
if ((layoutDev->rd_nterms >= 4) && ((subs = layoutDev->rd_fet_subs) != NULL))
|
if ((subs = layoutDev->rd_fet_subs) != NULL)
|
||||||
{
|
{
|
||||||
if (subs->rn_name != NULL && notdecremented)
|
if (subs->rn_name != NULL && notdecremented)
|
||||||
{
|
{
|
||||||
|
|
@ -1422,7 +1422,7 @@ ResFixUpConnections(extDev, layoutDev, extNode, nodename)
|
||||||
extNode->status |= DONTKILL;
|
extNode->status |= DONTKILL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (layoutDev->rd_nterms > 3)
|
||||||
{
|
{
|
||||||
if ((source = layoutDev->rd_fet_source) != NULL)
|
if ((source = layoutDev->rd_fet_source) != NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -1469,7 +1469,7 @@ ResFixUpConnections(extDev, layoutDev, extNode, nodename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (extDev->drain == extNode)
|
else if ((extDev->drain == extNode) && (layoutDev->rd_nterms > 3))
|
||||||
{
|
{
|
||||||
/* Check for devices with only one terminal. If it was cast as source, */
|
/* Check for devices with only one terminal. If it was cast as source, */
|
||||||
/* then swap it with the drain so that the code below handles it */
|
/* then swap it with the drain so that the code below handles it */
|
||||||
|
|
|
||||||
|
|
@ -387,7 +387,7 @@ ResMoveDevices(node1, node2)
|
||||||
devptr = devptr->te_nextt;
|
devptr = devptr->te_nextt;
|
||||||
if (device->rd_fet_gate == node1)
|
if (device->rd_fet_gate == node1)
|
||||||
device->rd_fet_gate = node2;
|
device->rd_fet_gate = node2;
|
||||||
else if ((device->rd_nterms >= 4) && (device->rd_fet_subs == node1))
|
else if (device->rd_fet_subs == node1)
|
||||||
device->rd_fet_subs = node2;
|
device->rd_fet_subs = node2;
|
||||||
else if (device->rd_fet_source == node1)
|
else if (device->rd_fet_source == node1)
|
||||||
device->rd_fet_source = node2;
|
device->rd_fet_source = node2;
|
||||||
|
|
|
||||||
|
|
@ -231,7 +231,8 @@ ResAddPlumbing(tile, dinfo, arg)
|
||||||
|
|
||||||
resDev = (resDevice *)mallocMagic((unsigned)(sizeof(resDevice)));
|
resDev = (resDevice *)mallocMagic((unsigned)(sizeof(resDevice)));
|
||||||
resDev->rd_nterms = nterms;
|
resDev->rd_nterms = nterms;
|
||||||
resDev->rd_terminals = (resNode **) mallocMagic(nterms * sizeof(resNode *));
|
|
||||||
|
resDev->rd_terminals = (resNode **)mallocMagic(nterms * sizeof(resNode *));
|
||||||
for (i = 0; i != nterms; i++)
|
for (i = 0; i != nterms; i++)
|
||||||
resDev->rd_terminals[i] = (resNode *) NULL;
|
resDev->rd_terminals[i] = (resNode *) NULL;
|
||||||
|
|
||||||
|
|
@ -733,6 +734,7 @@ ResPreProcessDevices(TileList, DeviceList, Def)
|
||||||
|
|
||||||
tile = PlaneGetHint(Def->cd_planes[pNum]);
|
tile = PlaneGetHint(Def->cd_planes[pNum]);
|
||||||
GOTOPOINT(tile, &(TileList->area.r_ll));
|
GOTOPOINT(tile, &(TileList->area.r_ll));
|
||||||
|
PlaneSetHint(Def->cd_planes[pNum], tile);
|
||||||
|
|
||||||
tt = TiGetType(tile);
|
tt = TiGetType(tile);
|
||||||
tstruct = (resInfo *) TiGetClientPTR(tile);
|
tstruct = (resInfo *) TiGetClientPTR(tile);
|
||||||
|
|
|
||||||
|
|
@ -51,16 +51,24 @@ typedef struct resistor
|
||||||
#define rr_connection1 rr_node[0]
|
#define rr_connection1 rr_node[0]
|
||||||
#define rr_connection2 rr_node[1]
|
#define rr_connection2 rr_node[1]
|
||||||
|
|
||||||
/* Definitions for old FET-style MOSFET devices */
|
/* Definitions for old FET-style MOSFET devices. Actual devices may have
|
||||||
|
* any number of terminals. "GATE" is the identifying type; "SUBS" is
|
||||||
|
* the substrate/well connection (if it exists), and the other terminals
|
||||||
|
* make up the remaining entries. Memory will be allocated for the
|
||||||
|
* substrate whether or not one is defined for the device. If the device
|
||||||
|
* does not define a substrate connection, then this entry will remain
|
||||||
|
* NULL.
|
||||||
|
*/
|
||||||
|
|
||||||
#define RT_GATE 0
|
#define RT_GATE 0
|
||||||
#define RT_SOURCE 1
|
#define RT_SUBS 1
|
||||||
#define RT_DRAIN 2
|
#define RT_SOURCE 2
|
||||||
#define RT_SUBS 3
|
#define RT_DRAIN 3
|
||||||
|
|
||||||
#define rd_fet_gate rd_terminals[RT_GATE]
|
#define rd_fet_gate rd_terminals[RT_GATE]
|
||||||
|
#define rd_fet_subs rd_terminals[RT_SUBS]
|
||||||
#define rd_fet_source rd_terminals[RT_SOURCE]
|
#define rd_fet_source rd_terminals[RT_SOURCE]
|
||||||
#define rd_fet_drain rd_terminals[RT_DRAIN]
|
#define rd_fet_drain rd_terminals[RT_DRAIN]
|
||||||
#define rd_fet_subs rd_terminals[RT_SUBS]
|
|
||||||
|
|
||||||
typedef struct device
|
typedef struct device
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -834,6 +834,8 @@ chunkdone:
|
||||||
if (DBIsContact(type))
|
if (DBIsContact(type))
|
||||||
TTMaskSetOnlyType(&typeMask, type);
|
TTMaskSetOnlyType(&typeMask, type);
|
||||||
|
|
||||||
|
/* Allow labels to be selected as part of the chunk */
|
||||||
|
TTMaskSetType(&typeMask, L_LABEL);
|
||||||
SelectArea(&newscx, &typeMask, xMask, NULL);
|
SelectArea(&newscx, &typeMask, xMask, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ SimConnectFunc(
|
||||||
TileType loctype, ctype;
|
TileType loctype, ctype;
|
||||||
TileType newdinfo = 0;
|
TileType newdinfo = 0;
|
||||||
int i, pNum;
|
int i, pNum;
|
||||||
static char nodeName[256];
|
static char nodeName[MAXPATHNAME];
|
||||||
CellDef *def;
|
CellDef *def;
|
||||||
TerminalPath *tpath = cx->tc_filter->tf_tpath;
|
TerminalPath *tpath = cx->tc_filter->tf_tpath;
|
||||||
|
|
||||||
|
|
@ -133,7 +133,8 @@ SimConnectFunc(
|
||||||
char c = *n;
|
char c = *n;
|
||||||
|
|
||||||
SigDisableInterrupts();
|
SigDisableInterrupts();
|
||||||
strcpy(nodeName, SimGetNodeName(cx->tc_scx, tile, dinfo, tpath->tp_first));
|
strncpy(nodeName, SimGetNodeName(cx->tc_scx, tile, dinfo, tpath->tp_first),
|
||||||
|
MAXPATHNAME);
|
||||||
SigEnableInterrupts();
|
SigEnableInterrupts();
|
||||||
|
|
||||||
*n = c;
|
*n = c;
|
||||||
|
|
|
||||||
|
|
@ -35,10 +35,10 @@ proc magic::libcallback {command} {
|
||||||
|
|
||||||
switch $command {
|
switch $command {
|
||||||
load {$winname load $celldef}
|
load {$winname load $celldef}
|
||||||
place {$winname getcell $celldef}
|
place {$winname getcell $celldef child 0 0}
|
||||||
pick {
|
pick {
|
||||||
magic::tool pick
|
magic::tool pick
|
||||||
$winname getcell $celldef
|
$winname getcell $celldef child 0 0
|
||||||
magic::startselect $winname pick
|
magic::startselect $winname pick
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -651,9 +651,9 @@ proc magic::startselect {window {option {}}} {
|
||||||
select nocycle
|
select nocycle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set Opts(origin) [cursor]
|
set Opts(origin) [cursor internal]
|
||||||
set Opts(motion) [bind ${window} <Motion>]
|
set Opts(motion) [bind ${window} <Motion>]
|
||||||
bind ${window} <Motion> [subst {$Opts(motion); set p \[cursor\]; \
|
bind ${window} <Motion> [subst {$Opts(motion); set p \[cursor internal\]; \
|
||||||
set x \[expr {\[lindex \$p 0\] - [lindex $Opts(origin) 0]}\]i; \
|
set x \[expr {\[lindex \$p 0\] - [lindex $Opts(origin) 0]}\]i; \
|
||||||
set y \[expr {\[lindex \$p 1\] - [lindex $Opts(origin) 1]}\]i; \
|
set y \[expr {\[lindex \$p 1\] - [lindex $Opts(origin) 1]}\]i; \
|
||||||
*bypass select move \${x} \${y}}]
|
*bypass select move \${x} \${y}}]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue