@@ -66,23 +66,31 @@ extern HashTable ResNodeTable;
66
66
void
67
67
ResInitializeConn ()
68
68
{
69
- TileType dev , diff ;
69
+ TileType dev , ttype ;
70
70
char * dev_name ;
71
+ int i ;
71
72
ExtDevice * devptr ;
72
73
73
74
for (dev = TT_TECHDEPBASE ; dev < TT_MAXTYPES ; dev ++ )
74
75
{
75
- devptr = ExtCurStyle -> exts_device [dev ];
76
- if ((devptr != NULL ) && ((dev_name = devptr -> exts_deviceName ) != NULL )
77
- && (strcmp (dev_name , "None" )))
76
+ for (devptr = ExtCurStyle -> exts_device [dev ]; devptr ; devptr = devptr -> exts_next )
78
77
{
79
- for (diff = TT_TECHDEPBASE ; diff < TT_MAXTYPES ; diff ++ )
78
+ if ((devptr != NULL ) && ((dev_name = devptr -> exts_deviceName ) != NULL )
79
+ && (strcmp (dev_name , "None" )))
80
80
{
81
- if TTMaskHasType (& (devptr -> exts_deviceSDTypes [0 ]), diff )
82
- TTMaskSetType (& ResConnectWithSD [diff ], dev );
81
+ for (ttype = TT_TECHDEPBASE ; ttype < TT_MAXTYPES ; ttype ++ )
82
+ {
83
+ for (i = 0 ; ; i ++ )
84
+ {
85
+ if (TTMaskIsZero (& (devptr -> exts_deviceSDTypes [i ])))
86
+ break ;
87
+ if TTMaskHasType (& (devptr -> exts_deviceSDTypes [i ]), ttype )
88
+ TTMaskSetType (& ResConnectWithSD [ttype ], dev );
89
+ }
83
90
84
- if TTMaskHasType (& (devptr -> exts_deviceSubstrateTypes ), diff )
85
- TTMaskSetType (& ResConnectWithSD [diff ], dev );
91
+ if TTMaskHasType (& (devptr -> exts_deviceSubstrateTypes ), ttype )
92
+ TTMaskSetType (& ResConnectWithSD [ttype ], dev );
93
+ }
86
94
}
87
95
}
88
96
TTMaskSetMask (& ResConnectWithSD [dev ], & DBConnectTbl [dev ]);
@@ -410,6 +418,7 @@ ResFindNewContactTiles(contacts)
410
418
TxError ("Error: setting contact tile to null\n" );
411
419
}
412
420
#endif
421
+
413
422
if ((IsSplit (tile ) && TTMaskHasType (& mask , TiGetRightType (tile )))
414
423
|| TTMaskHasType (& mask , TiGetType (tile )))
415
424
{
@@ -423,6 +432,30 @@ ResFindNewContactTiles(contacts)
423
432
(contacts -> cp_currentcontact ) += 1 ;
424
433
j -> contactList = ce ;
425
434
}
435
+ else
436
+ {
437
+ TileType ttype = TiGetTypeExact (tile );
438
+ if (DBIsContact (ttype ))
439
+ {
440
+ /* Handle the exceptional case in which a contact
441
+ * type is its own residue. This can be used for
442
+ * devices whose terminals are always a contact
443
+ * and for which a non-contact type cannot be drawn.
444
+ */
445
+ if (TTMaskIntersect (DBResidueMask (ttype ), & mask ))
446
+ {
447
+ tileJunk * j = (tileJunk * )tile -> ti_client ;
448
+ cElement * ce ;
449
+
450
+ ce = (cElement * ) mallocMagic ((unsigned ) (sizeof (cElement )));
451
+ contacts -> cp_tile [contacts -> cp_currentcontact ] = tile ;
452
+ ce -> ce_thisc = contacts ;
453
+ ce -> ce_nextc = j -> contactList ;
454
+ (contacts -> cp_currentcontact ) += 1 ;
455
+ j -> contactList = ce ;
456
+ }
457
+ }
458
+ }
426
459
}
427
460
#ifdef PARANOID
428
461
if (contacts -> cp_currentcontact >= LAYERS_PER_CONTACT )
@@ -1289,6 +1322,8 @@ FindStartTile(goodies, SourcePoint)
1289
1322
int pnum , t1 , t2 , i ;
1290
1323
ExtDevice * devptr ;
1291
1324
Rect r ;
1325
+ bool complex ;
1326
+ static Stack * devStack = NULL ;
1292
1327
1293
1328
/* If the drive point is on a contact, check for the contact residues */
1294
1329
/* first, then the contact type itself. */
@@ -1391,6 +1426,8 @@ FindStartTile(goodies, SourcePoint)
1391
1426
{
1392
1427
for (i = 0 ; i < devptr -> exts_deviceSDCount ; i ++ )
1393
1428
{
1429
+ complex = FALSE; /* Assume device is a single tile */
1430
+
1394
1431
/* left */
1395
1432
for (tp = BL (tile ); BOTTOM (tp ) < TOP (tile ); tp = RT (tp ))
1396
1433
{
@@ -1403,6 +1440,9 @@ FindStartTile(goodies, SourcePoint)
1403
1440
MAX (BOTTOM (tile ), BOTTOM (tp ))) >> 1 ;
1404
1441
return (tp );
1405
1442
}
1443
+ else if (tp -> ti_client != CLIENTDEFAULT )
1444
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1445
+ complex = TRUE;
1406
1446
}
1407
1447
1408
1448
/* right */
@@ -1417,6 +1457,9 @@ FindStartTile(goodies, SourcePoint)
1417
1457
MAX (BOTTOM (tile ), BOTTOM (tp ))) >> 1 ;
1418
1458
return (tp );
1419
1459
}
1460
+ else if (tp -> ti_client != CLIENTDEFAULT )
1461
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1462
+ complex = TRUE;
1420
1463
}
1421
1464
1422
1465
/* top */
@@ -1431,6 +1474,9 @@ FindStartTile(goodies, SourcePoint)
1431
1474
MAX (LEFT (tile ), LEFT (tp ))) >> 1 ;
1432
1475
return (tp );
1433
1476
}
1477
+ else if (tp -> ti_client != CLIENTDEFAULT )
1478
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1479
+ complex = TRUE;
1434
1480
}
1435
1481
1436
1482
/* bottom */
@@ -1445,6 +1491,149 @@ FindStartTile(goodies, SourcePoint)
1445
1491
MAX (LEFT (tile ), LEFT (tp ))) >> 1 ;
1446
1492
return (tp );
1447
1493
}
1494
+ else if (tp -> ti_client != CLIENTDEFAULT )
1495
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1496
+ complex = TRUE;
1497
+ }
1498
+
1499
+ if (complex == TRUE)
1500
+ {
1501
+ /* Didn't find a terminal but device has multiple */
1502
+ /* tiles, so make a secondary search looking at all */
1503
+ /* tiles of the device. */
1504
+
1505
+ if (devStack == NULL ) devStack = StackNew (8 );
1506
+
1507
+ ((tileJunk * )tile -> ti_client )-> tj_status |= RES_TILE_PUSHED ;
1508
+ STACKPUSH ((ClientData )tile , devStack );
1509
+ while (!StackEmpty (devStack ))
1510
+ {
1511
+ tile = (Tile * )STACKPOP (devStack );
1512
+
1513
+ /* left */
1514
+ for (tp = BL (tile ); BOTTOM (tp ) < TOP (tile ); tp = RT (tp ))
1515
+ {
1516
+ t2 = TiGetRightType (tp );
1517
+ if ((t2 != TT_SPACE ) &&
1518
+ TTMaskHasType (& (devptr -> exts_deviceSDTypes [i ]), t2 ))
1519
+ {
1520
+ SourcePoint -> p_x = LEFT (tile );
1521
+ SourcePoint -> p_y = (MIN (TOP (tile ),TOP (tp )) +
1522
+ MAX (BOTTOM (tile ), BOTTOM (tp ))) >> 1 ;
1523
+ while (!StackEmpty (devStack ))
1524
+ {
1525
+ STACKPOP (devStack );
1526
+ }
1527
+ return (tp );
1528
+ }
1529
+ else if (tp -> ti_client != CLIENTDEFAULT )
1530
+ {
1531
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1532
+ {
1533
+ if (!(((tileJunk * )tp -> ti_client )-> tj_status
1534
+ & RES_TILE_PUSHED ))
1535
+ {
1536
+ ((tileJunk * )tp -> ti_client )-> tj_status
1537
+ |= RES_TILE_PUSHED ;
1538
+ STACKPUSH ((ClientData )tp , devStack );
1539
+ }
1540
+ }
1541
+ }
1542
+ }
1543
+
1544
+ /* right */
1545
+ for (tp = TR (tile ); TOP (tp ) > BOTTOM (tile ); tp = LB (tp ))
1546
+ {
1547
+ t2 = TiGetLeftType (tp );
1548
+ if ((t2 != TT_SPACE ) &&
1549
+ TTMaskHasType (& (devptr -> exts_deviceSDTypes [i ]), t2 ))
1550
+ {
1551
+ SourcePoint -> p_x = RIGHT (tile );
1552
+ SourcePoint -> p_y = (MIN (TOP (tile ), TOP (tp ))+
1553
+ MAX (BOTTOM (tile ), BOTTOM (tp ))) >> 1 ;
1554
+ while (!StackEmpty (devStack ))
1555
+ {
1556
+ STACKPOP (devStack );
1557
+ }
1558
+ return (tp );
1559
+ }
1560
+ else if (tp -> ti_client != CLIENTDEFAULT )
1561
+ {
1562
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1563
+ {
1564
+ if (!(((tileJunk * )tp -> ti_client )-> tj_status
1565
+ & RES_TILE_PUSHED ))
1566
+ {
1567
+ ((tileJunk * )tp -> ti_client )-> tj_status
1568
+ |= RES_TILE_PUSHED ;
1569
+ STACKPUSH ((ClientData )tp , devStack );
1570
+ }
1571
+ }
1572
+ }
1573
+ }
1574
+
1575
+ /* top */
1576
+ for (tp = RT (tile ); RIGHT (tp ) > LEFT (tile ); tp = BL (tp ))
1577
+ {
1578
+ t2 = TiGetBottomType (tp );
1579
+ if ((t2 != TT_SPACE ) &&
1580
+ TTMaskHasType (& (devptr -> exts_deviceSDTypes [i ]), t2 ))
1581
+ {
1582
+ SourcePoint -> p_y = TOP (tile );
1583
+ SourcePoint -> p_x = (MIN (RIGHT (tile ),RIGHT (tp )) +
1584
+ MAX (LEFT (tile ), LEFT (tp ))) >> 1 ;
1585
+ while (!StackEmpty (devStack ))
1586
+ {
1587
+ STACKPOP (devStack );
1588
+ }
1589
+ return (tp );
1590
+ }
1591
+ else if (tp -> ti_client != CLIENTDEFAULT )
1592
+ {
1593
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1594
+ {
1595
+ if (!(((tileJunk * )tp -> ti_client )-> tj_status
1596
+ & RES_TILE_PUSHED ))
1597
+ {
1598
+ ((tileJunk * )tp -> ti_client )-> tj_status
1599
+ |= RES_TILE_PUSHED ;
1600
+ STACKPUSH ((ClientData )tp , devStack );
1601
+ }
1602
+ }
1603
+ }
1604
+ }
1605
+
1606
+ /* bottom */
1607
+ for (tp = LB (tile ); LEFT (tp ) < RIGHT (tile ); tp = TR (tp ))
1608
+ {
1609
+ t2 = TiGetTopType (tp );
1610
+ if ((t2 != TT_SPACE ) &&
1611
+ TTMaskHasType (& (devptr -> exts_deviceSDTypes [i ]), t2 ))
1612
+ {
1613
+ SourcePoint -> p_y = BOTTOM (tile );
1614
+ SourcePoint -> p_x = (MIN (RIGHT (tile ), RIGHT (tp )) +
1615
+ MAX (LEFT (tile ), LEFT (tp ))) >> 1 ;
1616
+ while (!StackEmpty (devStack ))
1617
+ {
1618
+ STACKPOP (devStack );
1619
+ }
1620
+ return (tp );
1621
+ }
1622
+ else if (tp -> ti_client != CLIENTDEFAULT )
1623
+ {
1624
+ if (((tileJunk * )tp -> ti_client )-> tj_status & RES_TILE_DEV )
1625
+ {
1626
+ if (!(((tileJunk * )tp -> ti_client )-> tj_status
1627
+ & RES_TILE_PUSHED ))
1628
+ {
1629
+ ((tileJunk * )tp -> ti_client )-> tj_status
1630
+ |= RES_TILE_PUSHED ;
1631
+ STACKPUSH ((ClientData )tp , devStack );
1632
+ }
1633
+ }
1634
+ }
1635
+ }
1636
+ }
1448
1637
}
1449
1638
}
1450
1639
0 commit comments