@@ -285,13 +285,19 @@ IdStringList Arch::getWireName(WireId wire) const
285
285
286
286
PipId Arch::getPipByName (IdStringList name) const
287
287
{
288
- NPNR_ASSERT (name.size () == 3 );
288
+ NPNR_ASSERT (name.size () == 3 || (name. size () == 4 && name[ 4 ] == getCtx ()-> id ( " INV " )) );
289
289
int tile = tile_name2idx.at (name[0 ]);
290
290
const auto &tdata = chip_tile_info (chip_info, tile);
291
291
for (int pip = 0 ; pip < tdata.pips .ssize (); pip++) {
292
292
if (IdString (tdata.wires [tdata.pips [pip].dst_wire ].name ) == name[1 ] &&
293
- IdString (tdata.wires [tdata.pips [pip].src_wire ].name ) == name[2 ])
294
- return PipId (tile, pip);
293
+ IdString (tdata.wires [tdata.pips [pip].src_wire ].name ) == name[2 ]) {
294
+
295
+ auto tmp_pip = PipId (tile, pip);
296
+ if ((name.size () == 3 && !getCtx ()->isPipInverting (tmp_pip)) ||
297
+ (name.size () == 4 && getCtx ()->isPipInverting (tmp_pip))) {
298
+ return tmp_pip;
299
+ }
300
+ }
295
301
}
296
302
return PipId ();
297
303
}
@@ -300,6 +306,13 @@ IdStringList Arch::getPipName(PipId pip) const
300
306
{
301
307
auto &tdata = chip_tile_info (chip_info, pip.tile );
302
308
auto &pdata = tdata.pips [pip.index ];
309
+ if (getCtx ()->isPipInverting (pip)) {
310
+ // TODO: variadic IdStringList::concat? this is messy.
311
+ return IdStringList::concat (tile_name.at (pip.tile ),
312
+ IdStringList::concat (IdString (tdata.wires [pdata.dst_wire ].name ),
313
+ IdStringList::concat (IdString (tdata.wires [pdata.src_wire ].name ),
314
+ getCtx ()->id (" INV" ))));
315
+ }
303
316
return IdStringList::concat (tile_name.at (pip.tile ),
304
317
IdStringList::concat (IdString (tdata.wires [pdata.dst_wire ].name ),
305
318
IdString (tdata.wires [pdata.src_wire ].name )));
0 commit comments