diff options
| author | Eddie Hung <eddieh@ece.ubc.ca> | 2018-11-13 12:12:11 -0800 | 
|---|---|---|
| committer | Eddie Hung <eddieh@ece.ubc.ca> | 2018-11-13 12:12:11 -0800 | 
| commit | 2d39cde17be718d76e6f5c06c8f06c70d44c7918 (patch) | |
| tree | 8b0e0f98125b2ec7fdb55c9644c524753a7a1cd5 /ice40/arch.h | |
| parent | ba7a7a3733c493fc950d5bedbc49b4c78b451b3d (diff) | |
| parent | 3b2b15dc4a6cdf9cadab96b1db5483d4f7082dff (diff) | |
| download | nextpnr-2d39cde17be718d76e6f5c06c8f06c70d44c7918.tar.gz nextpnr-2d39cde17be718d76e6f5c06c8f06c70d44c7918.tar.bz2 nextpnr-2d39cde17be718d76e6f5c06c8f06c70d44c7918.zip | |
Merge remote-tracking branch 'origin/master' into timingapi
Diffstat (limited to 'ice40/arch.h')
| -rw-r--r-- | ice40/arch.h | 54 | 
1 files changed, 37 insertions, 17 deletions
| diff --git a/ice40/arch.h b/ice40/arch.h index 80fcf761..e9ec8130 100644 --- a/ice40/arch.h +++ b/ice40/arch.h @@ -404,7 +404,7 @@ struct Arch : BaseCtx      std::vector<CellInfo *> bel_to_cell;      std::vector<NetInfo *> wire_to_net;      std::vector<NetInfo *> pip_to_net; -    std::vector<NetInfo *> switches_locked; +    std::vector<WireId> switches_locked;      ArchArgs args;      Arch(ArchArgs args); @@ -546,7 +546,7 @@ struct Arch : BaseCtx          auto pip = it->second.pip;          if (pip != PipId()) {              pip_to_net[pip.index] = nullptr; -            switches_locked[chip_info->pip_data[pip.index].switch_index] = nullptr; +            switches_locked[chip_info->pip_data[pip.index].switch_index] = WireId();          }          net_wires.erase(it); @@ -566,6 +566,8 @@ struct Arch : BaseCtx          return wire_to_net[wire.index];      } +    WireId getConflictingWireWire(WireId wire) const { return wire; } +      NetInfo *getConflictingWireNet(WireId wire) const      {          NPNR_ASSERT(wire != WireId()); @@ -608,14 +610,15 @@ struct Arch : BaseCtx      {          NPNR_ASSERT(pip != PipId());          NPNR_ASSERT(pip_to_net[pip.index] == nullptr); -        NPNR_ASSERT(switches_locked[chip_info->pip_data[pip.index].switch_index] == nullptr); - -        pip_to_net[pip.index] = net; -        switches_locked[chip_info->pip_data[pip.index].switch_index] = net; +        NPNR_ASSERT(switches_locked[chip_info->pip_data[pip.index].switch_index] == WireId());          WireId dst;          dst.index = chip_info->pip_data[pip.index].dst;          NPNR_ASSERT(wire_to_net[dst.index] == nullptr); + +        pip_to_net[pip.index] = net; +        switches_locked[chip_info->pip_data[pip.index].switch_index] = dst; +          wire_to_net[dst.index] = net;          net->wires[dst].pip = pip;          net->wires[dst].strength = strength; @@ -627,7 +630,7 @@ struct Arch : BaseCtx      {          NPNR_ASSERT(pip != PipId());          NPNR_ASSERT(pip_to_net[pip.index] != nullptr); -        NPNR_ASSERT(switches_locked[chip_info->pip_data[pip.index].switch_index] != nullptr); +        NPNR_ASSERT(switches_locked[chip_info->pip_data[pip.index].switch_index] != WireId());          WireId dst;          dst.index = chip_info->pip_data[pip.index].dst; @@ -636,33 +639,39 @@ struct Arch : BaseCtx          pip_to_net[pip.index]->wires.erase(dst);          pip_to_net[pip.index] = nullptr; -        switches_locked[chip_info->pip_data[pip.index].switch_index] = nullptr; +        switches_locked[chip_info->pip_data[pip.index].switch_index] = WireId();          refreshUiPip(pip);          refreshUiWire(dst);      } -    bool checkPipAvail(PipId pip) const +    bool ice40_pip_hard_unavail(PipId pip) const      {          NPNR_ASSERT(pip != PipId());          auto &pi = chip_info->pip_data[pip.index];          auto &si = chip_info->bits_info->switches[pi.switch_index]; -        if (switches_locked[pi.switch_index] != nullptr) -            return false; -          if (pi.flags & PipInfoPOD::FLAG_ROUTETHRU) {              NPNR_ASSERT(si.bel >= 0);              if (bel_to_cell[si.bel] != nullptr) -                return false; +                return true;          }          if (pi.flags & PipInfoPOD::FLAG_NOCARRY) {              NPNR_ASSERT(si.bel >= 0);              if (bel_carry[si.bel]) -                return false; +                return true;          } -        return true; +        return false; +    } + +    bool checkPipAvail(PipId pip) const +    { +        if (ice40_pip_hard_unavail(pip)) +            return false; + +        auto &pi = chip_info->pip_data[pip.index]; +        return switches_locked[pi.switch_index] == WireId();      }      NetInfo *getBoundPipNet(PipId pip) const @@ -671,12 +680,23 @@ struct Arch : BaseCtx          return pip_to_net[pip.index];      } -    NetInfo *getConflictingPipNet(PipId pip) const +    WireId getConflictingPipWire(PipId pip) const      { -        NPNR_ASSERT(pip != PipId()); +        if (ice40_pip_hard_unavail(pip)) +            return WireId(); +          return switches_locked[chip_info->pip_data[pip.index].switch_index];      } +    NetInfo *getConflictingPipNet(PipId pip) const +    { +        if (ice40_pip_hard_unavail(pip)) +            return nullptr; + +        WireId wire = switches_locked[chip_info->pip_data[pip.index].switch_index]; +        return wire == WireId() ? nullptr : wire_to_net[wire.index]; +    } +      AllPipRange getPips() const      {          AllPipRange range; | 
