parent
d4a0feb1ad
commit
d9c3c117a3
@ -21,9 +21,16 @@
|
|||||||
|
|
||||||
NEXTPNR_NAMESPACE_BEGIN
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
|
||||||
MutateContext BaseCtx::rwproxy(void) { return MutateContext(reinterpret_cast<Arch *>(this)); }
|
MutateContext BaseCtx::rwproxy(void)
|
||||||
|
{
|
||||||
|
return MutateContext(reinterpret_cast<Arch *>(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadContext BaseCtx::rproxy(void) const
|
||||||
|
{
|
||||||
|
return ReadContext(reinterpret_cast<const Arch *>(this));
|
||||||
|
}
|
||||||
|
|
||||||
ReadContext BaseCtx::rproxy(void) const { return ReadContext(reinterpret_cast<const Arch *>(this)); }
|
|
||||||
|
|
||||||
assertion_failure::assertion_failure(std::string msg, std::string expr_str, std::string filename, int line)
|
assertion_failure::assertion_failure(std::string msg, std::string expr_str, std::string filename, int line)
|
||||||
: runtime_error("Assertion failure: " + msg + " (" + filename + ":" + std::to_string(line) + ")"), msg(msg),
|
: runtime_error("Assertion failure: " + msg + " (" + filename + ":" + std::to_string(line) + ")"), msg(msg),
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <boost/thread/shared_mutex.hpp>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -27,6 +26,7 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <boost/thread/shared_mutex.hpp>
|
||||||
|
|
||||||
#ifndef NEXTPNR_H
|
#ifndef NEXTPNR_H
|
||||||
#define NEXTPNR_H
|
#define NEXTPNR_H
|
||||||
@ -261,8 +261,7 @@ class BaseCtx
|
|||||||
friend class MutateContext;
|
friend class MutateContext;
|
||||||
friend class BaseReadCtx;
|
friend class BaseReadCtx;
|
||||||
friend class BaseMutateCtx;
|
friend class BaseMutateCtx;
|
||||||
|
private:
|
||||||
private:
|
|
||||||
mutable boost::shared_mutex mtx_;
|
mutable boost::shared_mutex mtx_;
|
||||||
|
|
||||||
bool allUiReload = false;
|
bool allUiReload = false;
|
||||||
@ -272,7 +271,7 @@ class BaseCtx
|
|||||||
std::unordered_set<PipId> pipUiReload;
|
std::unordered_set<PipId> pipUiReload;
|
||||||
std::unordered_set<GroupId> groupUiReload;
|
std::unordered_set<GroupId> groupUiReload;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IdString id(const std::string &s) const { return IdString(this, s); }
|
IdString id(const std::string &s) const { return IdString(this, s); }
|
||||||
IdString id(const char *s) const { return IdString(this, s); }
|
IdString id(const char *s) const { return IdString(this, s); }
|
||||||
|
|
||||||
@ -312,16 +311,16 @@ class BaseCtx
|
|||||||
// locks can be taken while this one still exists. Ie., the UI can draw
|
// locks can be taken while this one still exists. Ie., the UI can draw
|
||||||
// elements while the PnR is going a RO operation.
|
// elements while the PnR is going a RO operation.
|
||||||
ReadContext rproxy(void) const;
|
ReadContext rproxy(void) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// State-accessing read-only methods that every architecture object should
|
// State-accessing read-only methods that every architecture object should
|
||||||
// contain.
|
// contain.
|
||||||
class BaseReadCtx
|
class BaseReadCtx
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
const BaseCtx *base_;
|
const BaseCtx *base_;
|
||||||
|
public:
|
||||||
public:
|
|
||||||
BaseReadCtx(const BaseCtx *base) : base_(base) {}
|
BaseReadCtx(const BaseCtx *base) : base_(base) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -329,23 +328,41 @@ class BaseReadCtx
|
|||||||
// contain.
|
// contain.
|
||||||
class BaseMutateCtx
|
class BaseMutateCtx
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
BaseCtx *base_;
|
BaseCtx *base_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BaseMutateCtx(BaseCtx *base) : base_(base) {}
|
BaseMutateCtx(BaseCtx *base) : base_(base) {}
|
||||||
|
|
||||||
void refreshUi(void) { base_->allUiReload = true; }
|
void refreshUi(void)
|
||||||
|
{
|
||||||
|
base_->allUiReload = true;
|
||||||
|
}
|
||||||
|
|
||||||
void refreshUiFrame(void) { base_->frameUiReload = true; }
|
void refreshUiFrame(void)
|
||||||
|
{
|
||||||
|
base_->frameUiReload = true;
|
||||||
|
}
|
||||||
|
|
||||||
void refreshUiBel(BelId bel) { base_->belUiReload.insert(bel); }
|
void refreshUiBel(BelId bel)
|
||||||
|
{
|
||||||
|
base_->belUiReload.insert(bel);
|
||||||
|
}
|
||||||
|
|
||||||
void refreshUiWire(WireId wire) { base_->wireUiReload.insert(wire); }
|
void refreshUiWire(WireId wire)
|
||||||
|
{
|
||||||
|
base_->wireUiReload.insert(wire);
|
||||||
|
}
|
||||||
|
|
||||||
void refreshUiPip(PipId pip) { base_->pipUiReload.insert(pip); }
|
void refreshUiPip(PipId pip)
|
||||||
|
{
|
||||||
|
base_->pipUiReload.insert(pip);
|
||||||
|
}
|
||||||
|
|
||||||
void refreshUiGroup(GroupId group) { base_->groupUiReload.insert(group); }
|
void refreshUiGroup(GroupId group)
|
||||||
|
{
|
||||||
|
base_->groupUiReload.insert(group);
|
||||||
|
}
|
||||||
|
|
||||||
UIUpdatesRequired getUIUpdatesRequired(void)
|
UIUpdatesRequired getUIUpdatesRequired(void)
|
||||||
{
|
{
|
||||||
@ -377,46 +394,49 @@ NEXTPNR_NAMESPACE_BEGIN
|
|||||||
class ReadContext : public ArchReadMethods
|
class ReadContext : public ArchReadMethods
|
||||||
{
|
{
|
||||||
friend class BaseCtx;
|
friend class BaseCtx;
|
||||||
|
private:
|
||||||
private:
|
|
||||||
boost::shared_mutex *lock_;
|
boost::shared_mutex *lock_;
|
||||||
ReadContext(const Arch *parent) : ArchReadMethods(parent), lock_(&parent->mtx_) { lock_->lock_shared(); }
|
ReadContext(const Arch *parent) : ArchReadMethods(parent), lock_(&parent->mtx_)
|
||||||
|
{
|
||||||
public:
|
lock_->lock_shared();
|
||||||
|
}
|
||||||
|
public:
|
||||||
~ReadContext()
|
~ReadContext()
|
||||||
{
|
{
|
||||||
if (lock_ != nullptr) {
|
if (lock_ != nullptr) {
|
||||||
lock_->unlock_shared();
|
lock_->unlock_shared();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ReadContext(ReadContext &&other) : ArchReadMethods(other), lock_(other.lock_) { other.lock_ = nullptr; }
|
ReadContext(ReadContext &&other): ArchReadMethods(other), lock_(other.lock_)
|
||||||
|
{
|
||||||
|
other.lock_ = nullptr;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Read proxy to access MutateMethods while holding lock on underlying BaseCtx.
|
// Read proxy to access MutateMethods while holding lock on underlying BaseCtx.
|
||||||
class MutateContext : public ArchReadMethods, public ArchMutateMethods
|
class MutateContext : public ArchReadMethods, public ArchMutateMethods
|
||||||
{
|
{
|
||||||
friend class BaseCtx;
|
friend class BaseCtx;
|
||||||
|
private:
|
||||||
private:
|
|
||||||
boost::shared_mutex *lock_;
|
boost::shared_mutex *lock_;
|
||||||
MutateContext(Arch *parent) : ArchReadMethods(parent), ArchMutateMethods(parent), lock_(&parent->mtx_)
|
MutateContext(Arch *parent) : ArchReadMethods(parent), ArchMutateMethods(parent), lock_(&parent->mtx_)
|
||||||
{
|
{
|
||||||
lock_->lock();
|
lock_->lock();
|
||||||
}
|
}
|
||||||
|
public:
|
||||||
public:
|
|
||||||
~MutateContext()
|
~MutateContext()
|
||||||
{
|
{
|
||||||
if (lock_ != nullptr) {
|
if (lock_ != nullptr) {
|
||||||
lock_->unlock();
|
lock_->unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MutateContext(MutateContext &&other) : ArchReadMethods(other), ArchMutateMethods(other), lock_(other.lock_)
|
MutateContext(MutateContext &&other): ArchReadMethods(other), ArchMutateMethods(other), lock_(other.lock_)
|
||||||
{
|
{
|
||||||
other.lock_ = nullptr;
|
other.lock_ = nullptr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Context : Arch
|
struct Context : Arch
|
||||||
{
|
{
|
||||||
bool verbose = false;
|
bool verbose = false;
|
||||||
|
@ -29,7 +29,8 @@ NEXTPNR_NAMESPACE_BEGIN
|
|||||||
typedef int64_t wirelen_t;
|
typedef int64_t wirelen_t;
|
||||||
|
|
||||||
// Get the total estimated wirelength for a net
|
// Get the total estimated wirelength for a net
|
||||||
template <typename T> wirelen_t get_net_wirelength(const T &proxy, const Context *ctx, const NetInfo *net, float &tns)
|
template <typename T>
|
||||||
|
wirelen_t get_net_wirelength(const T &proxy, const Context *ctx, const NetInfo *net, float &tns)
|
||||||
{
|
{
|
||||||
wirelen_t wirelength = 0;
|
wirelen_t wirelength = 0;
|
||||||
int driver_x, driver_y;
|
int driver_x, driver_y;
|
||||||
@ -80,7 +81,8 @@ template <typename T> wirelen_t get_net_wirelength(const T &proxy, const Context
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return the wirelength of all nets connected to a cell
|
// Return the wirelength of all nets connected to a cell
|
||||||
template <typename T> wirelen_t get_cell_wirelength(const T &proxy, const Context *ctx, const CellInfo *cell)
|
template <typename T>
|
||||||
|
wirelen_t get_cell_wirelength(const T &proxy, const Context *ctx, const CellInfo *cell)
|
||||||
{
|
{
|
||||||
std::set<IdString> nets;
|
std::set<IdString> nets;
|
||||||
for (auto p : cell->ports) {
|
for (auto p : cell->ports) {
|
||||||
|
@ -136,6 +136,7 @@ struct Router
|
|||||||
int thisVisitCnt = 0;
|
int thisVisitCnt = 0;
|
||||||
int thisVisitCntLimit = 0;
|
int thisVisitCntLimit = 0;
|
||||||
|
|
||||||
|
|
||||||
while (!queue.empty() && (thisVisitCntLimit == 0 || thisVisitCnt < thisVisitCntLimit)) {
|
while (!queue.empty() && (thisVisitCntLimit == 0 || thisVisitCnt < thisVisitCntLimit)) {
|
||||||
QueuedWire qw = queue.top();
|
QueuedWire qw = queue.top();
|
||||||
queue.pop();
|
queue.pop();
|
||||||
|
104
ice40/arch.cc
104
ice40/arch.cc
@ -259,43 +259,99 @@ BelRange Arch::getBelsAtSameTile(BelId bel) const
|
|||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// Shorthands to ArchProxy
|
// Shorthands to ArchProxy
|
||||||
|
|
||||||
BelId Arch::getBelByName(IdString name) const { return rproxy().getBelByName(name); }
|
BelId Arch::getBelByName(IdString name) const
|
||||||
|
{
|
||||||
|
return rproxy().getBelByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
void Arch::bindWire(WireId wire, IdString net, PlaceStrength strength) { rwproxy().bindWire(wire, net, strength); }
|
void Arch::bindWire(WireId wire, IdString net, PlaceStrength strength)
|
||||||
|
{
|
||||||
|
rwproxy().bindWire(wire, net, strength);
|
||||||
|
}
|
||||||
|
|
||||||
void Arch::unbindWire(WireId wire) { rwproxy().unbindWire(wire); }
|
void Arch::unbindWire(WireId wire)
|
||||||
|
{
|
||||||
|
rwproxy().unbindWire(wire);
|
||||||
|
}
|
||||||
|
|
||||||
void Arch::bindBel(BelId bel, IdString cell, PlaceStrength strength) { rwproxy().bindBel(bel, cell, strength); }
|
void Arch::bindBel(BelId bel, IdString cell, PlaceStrength strength) {
|
||||||
|
rwproxy().bindBel(bel, cell, strength);
|
||||||
|
}
|
||||||
|
|
||||||
void Arch::unbindBel(BelId bel) { rwproxy().unbindBel(bel); }
|
void Arch::unbindBel(BelId bel)
|
||||||
|
{
|
||||||
|
rwproxy().unbindBel(bel);
|
||||||
|
}
|
||||||
|
|
||||||
bool Arch::checkBelAvail(BelId bel) const { return rproxy().checkBelAvail(bel); }
|
bool Arch::checkBelAvail(BelId bel) const
|
||||||
|
{
|
||||||
|
return rproxy().checkBelAvail(bel);
|
||||||
|
}
|
||||||
|
|
||||||
IdString Arch::getBoundBelCell(BelId bel) const { return rproxy().getBoundBelCell(bel); }
|
IdString Arch::getBoundBelCell(BelId bel) const
|
||||||
|
{
|
||||||
|
return rproxy().getBoundBelCell(bel);
|
||||||
|
}
|
||||||
|
|
||||||
IdString Arch::getConflictingBelCell(BelId bel) const { return rproxy().getConflictingBelCell(bel); }
|
IdString Arch::getConflictingBelCell(BelId bel) const
|
||||||
|
{
|
||||||
|
return rproxy().getConflictingBelCell(bel);
|
||||||
|
}
|
||||||
|
|
||||||
WireId Arch::getWireByName(IdString name) const { return rproxy().getWireByName(name); }
|
WireId Arch::getWireByName(IdString name) const
|
||||||
|
{
|
||||||
|
return rproxy().getWireByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
WireId Arch::getWireBelPin(BelId bel, PortPin pin) const { return rproxy().getWireBelPin(bel, pin); }
|
WireId Arch::getWireBelPin(BelId bel, PortPin pin) const
|
||||||
|
{
|
||||||
|
return rproxy().getWireBelPin(bel, pin);
|
||||||
|
}
|
||||||
|
|
||||||
bool Arch::checkWireAvail(WireId wire) const { return rproxy().checkWireAvail(wire); }
|
bool Arch::checkWireAvail(WireId wire) const
|
||||||
|
{
|
||||||
|
return rproxy().checkWireAvail(wire);
|
||||||
|
}
|
||||||
|
|
||||||
IdString Arch::getBoundWireNet(WireId wire) const { return rproxy().getBoundWireNet(wire); }
|
IdString Arch::getBoundWireNet(WireId wire) const
|
||||||
|
{
|
||||||
|
return rproxy().getBoundWireNet(wire);
|
||||||
|
}
|
||||||
|
|
||||||
IdString Arch::getConflictingWireNet(WireId wire) const { return rproxy().getConflictingWireNet(wire); }
|
IdString Arch::getConflictingWireNet(WireId wire) const
|
||||||
|
{
|
||||||
|
return rproxy().getConflictingWireNet(wire);
|
||||||
|
}
|
||||||
|
|
||||||
PipId Arch::getPipByName(IdString name) const { return rproxy().getPipByName(name); }
|
PipId Arch::getPipByName(IdString name) const
|
||||||
|
{
|
||||||
|
return rproxy().getPipByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
void Arch::bindPip(PipId pip, IdString net, PlaceStrength strength) { return rwproxy().bindPip(pip, net, strength); }
|
void Arch::bindPip(PipId pip, IdString net, PlaceStrength strength)
|
||||||
|
{
|
||||||
|
return rwproxy().bindPip(pip, net, strength);
|
||||||
|
}
|
||||||
|
|
||||||
void Arch::unbindPip(PipId pip) { return rwproxy().unbindPip(pip); }
|
void Arch::unbindPip(PipId pip)
|
||||||
|
{
|
||||||
|
return rwproxy().unbindPip(pip);
|
||||||
|
}
|
||||||
|
|
||||||
bool Arch::checkPipAvail(PipId pip) const { return rproxy().checkPipAvail(pip); }
|
bool Arch::checkPipAvail(PipId pip) const
|
||||||
|
{
|
||||||
|
return rproxy().checkPipAvail(pip);
|
||||||
|
}
|
||||||
|
|
||||||
IdString Arch::getBoundPipNet(PipId pip) const { return rproxy().getBoundPipNet(pip); }
|
IdString Arch::getBoundPipNet(PipId pip) const
|
||||||
|
{
|
||||||
|
return rproxy().getBoundPipNet(pip);
|
||||||
|
}
|
||||||
|
|
||||||
IdString Arch::getConflictingPipNet(PipId pip) const { return rproxy().getConflictingPipNet(pip); }
|
IdString Arch::getConflictingPipNet(PipId pip) const
|
||||||
|
{
|
||||||
|
return rproxy().getConflictingPipNet(pip);
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
@ -574,7 +630,8 @@ std::vector<GraphicElement> ArchReadMethods::getDecalGraphics(DecalId decal) con
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bel_type == TYPE_ICESTORM_RAM) {
|
if (bel_type == TYPE_ICESTORM_RAM) {
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
int tx = chip_info->bel_data[bel.index].x;
|
int tx = chip_info->bel_data[bel.index].x;
|
||||||
int ty = chip_info->bel_data[bel.index].y + i;
|
int ty = chip_info->bel_data[bel.index].y + i;
|
||||||
|
|
||||||
@ -584,7 +641,7 @@ std::vector<GraphicElement> ArchReadMethods::getDecalGraphics(DecalId decal) con
|
|||||||
el.x1 = chip_info->bel_data[bel.index].x + logic_cell_x1;
|
el.x1 = chip_info->bel_data[bel.index].x + logic_cell_x1;
|
||||||
el.x2 = chip_info->bel_data[bel.index].x + logic_cell_x2;
|
el.x2 = chip_info->bel_data[bel.index].x + logic_cell_x2;
|
||||||
el.y1 = chip_info->bel_data[bel.index].y + logic_cell_y1;
|
el.y1 = chip_info->bel_data[bel.index].y + logic_cell_y1;
|
||||||
el.y2 = chip_info->bel_data[bel.index].y + logic_cell_y2 + 7 * logic_cell_pitch;
|
el.y2 = chip_info->bel_data[bel.index].y + logic_cell_y2 + 7*logic_cell_pitch;
|
||||||
el.z = 0;
|
el.z = 0;
|
||||||
ret.push_back(el);
|
ret.push_back(el);
|
||||||
|
|
||||||
@ -879,6 +936,9 @@ void ArchMutateMethods::unbindPip(PipId pip)
|
|||||||
refreshUiWire(dst);
|
refreshUiWire(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
CellInfo *ArchMutateMethods::getCell(IdString cell) { return parent_->cells.at(cell).get(); }
|
CellInfo *ArchMutateMethods::getCell(IdString cell)
|
||||||
|
{
|
||||||
|
return parent_->cells.at(cell).get();
|
||||||
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
51
ice40/arch.h
51
ice40/arch.h
@ -343,8 +343,7 @@ class Arch : public BaseCtx
|
|||||||
// We let proxy methods access our state.
|
// We let proxy methods access our state.
|
||||||
friend class ArchMutateMethods;
|
friend class ArchMutateMethods;
|
||||||
friend class ArchReadMethods;
|
friend class ArchReadMethods;
|
||||||
|
private:
|
||||||
private:
|
|
||||||
// All of the following...
|
// All of the following...
|
||||||
std::vector<IdString> bel_to_cell;
|
std::vector<IdString> bel_to_cell;
|
||||||
std::vector<IdString> wire_to_net;
|
std::vector<IdString> wire_to_net;
|
||||||
@ -354,7 +353,7 @@ class Arch : public BaseCtx
|
|||||||
mutable std::unordered_map<IdString, int> wire_by_name;
|
mutable std::unordered_map<IdString, int> wire_by_name;
|
||||||
mutable std::unordered_map<IdString, int> pip_by_name;
|
mutable std::unordered_map<IdString, int> pip_by_name;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const ChipInfoPOD *chip_info;
|
const ChipInfoPOD *chip_info;
|
||||||
const PackageInfoPOD *package_info;
|
const PackageInfoPOD *package_info;
|
||||||
|
|
||||||
@ -411,7 +410,10 @@ class Arch : public BaseCtx
|
|||||||
return id(chip_info->bel_data[bel.index].name.get());
|
return id(chip_info->bel_data[bel.index].name.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t getBelChecksum(BelId bel) const { return bel.index; }
|
uint32_t getBelChecksum(BelId bel) const
|
||||||
|
{
|
||||||
|
return bel.index;
|
||||||
|
}
|
||||||
|
|
||||||
BelRange getBels() const
|
BelRange getBels() const
|
||||||
{
|
{
|
||||||
@ -443,6 +445,7 @@ class Arch : public BaseCtx
|
|||||||
return chip_info->bel_data[bel.index].type;
|
return chip_info->bel_data[bel.index].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BelPin getBelPinUphill(WireId wire) const
|
BelPin getBelPinUphill(WireId wire) const
|
||||||
{
|
{
|
||||||
BelPin ret;
|
BelPin ret;
|
||||||
@ -546,6 +549,7 @@ class Arch : public BaseCtx
|
|||||||
return range;
|
return range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BelId getPackagePinBel(const std::string &pin) const;
|
BelId getPackagePinBel(const std::string &pin) const;
|
||||||
std::string getBelPackagePin(BelId bel) const;
|
std::string getBelPackagePin(BelId bel) const;
|
||||||
|
|
||||||
@ -607,9 +611,8 @@ class Arch : public BaseCtx
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Read-only methods on Arch that require state access.
|
// Read-only methods on Arch that require state access.
|
||||||
class ArchReadMethods : public BaseReadCtx
|
class ArchReadMethods : public BaseReadCtx {
|
||||||
{
|
private:
|
||||||
private:
|
|
||||||
const Arch *parent_;
|
const Arch *parent_;
|
||||||
const ChipInfoPOD *chip_info;
|
const ChipInfoPOD *chip_info;
|
||||||
const std::vector<IdString> &bel_to_cell;
|
const std::vector<IdString> &bel_to_cell;
|
||||||
@ -620,15 +623,14 @@ class ArchReadMethods : public BaseReadCtx
|
|||||||
std::unordered_map<IdString, int> &wire_by_name;
|
std::unordered_map<IdString, int> &wire_by_name;
|
||||||
std::unordered_map<IdString, int> &pip_by_name;
|
std::unordered_map<IdString, int> &pip_by_name;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~ArchReadMethods() noexcept {}
|
~ArchReadMethods() noexcept { }
|
||||||
ArchReadMethods(const Arch *parent)
|
ArchReadMethods(const Arch *parent) : BaseReadCtx(parent), parent_(parent),
|
||||||
: BaseReadCtx(parent), parent_(parent), chip_info(parent->chip_info), bel_to_cell(parent->bel_to_cell),
|
chip_info(parent->chip_info), bel_to_cell(parent->bel_to_cell),
|
||||||
wire_to_net(parent->wire_to_net), pip_to_net(parent->pip_to_net),
|
wire_to_net(parent->wire_to_net), pip_to_net(parent->pip_to_net),
|
||||||
switches_locked(parent->switches_locked), bel_by_name(parent->bel_by_name),
|
switches_locked(parent->switches_locked),
|
||||||
wire_by_name(parent->wire_by_name), pip_by_name(parent->pip_by_name)
|
bel_by_name(parent->bel_by_name), wire_by_name(parent->wire_by_name),
|
||||||
{
|
pip_by_name(parent->pip_by_name) {}
|
||||||
}
|
|
||||||
ArchReadMethods(ArchReadMethods &&other) noexcept : ArchReadMethods(other.parent_) {}
|
ArchReadMethods(ArchReadMethods &&other) noexcept : ArchReadMethods(other.parent_) {}
|
||||||
ArchReadMethods(const ArchReadMethods &other) : ArchReadMethods(other.parent_) {}
|
ArchReadMethods(const ArchReadMethods &other) : ArchReadMethods(other.parent_) {}
|
||||||
|
|
||||||
@ -667,11 +669,9 @@ class ArchReadMethods : public BaseReadCtx
|
|||||||
};
|
};
|
||||||
|
|
||||||
// State mutating methods on Arch.
|
// State mutating methods on Arch.
|
||||||
class ArchMutateMethods : public BaseMutateCtx
|
class ArchMutateMethods : public BaseMutateCtx {
|
||||||
{
|
|
||||||
friend class MutateContext;
|
friend class MutateContext;
|
||||||
|
private:
|
||||||
private:
|
|
||||||
Arch *parent_;
|
Arch *parent_;
|
||||||
const ChipInfoPOD *chip_info;
|
const ChipInfoPOD *chip_info;
|
||||||
std::vector<IdString> &bel_to_cell;
|
std::vector<IdString> &bel_to_cell;
|
||||||
@ -682,14 +682,13 @@ class ArchMutateMethods : public BaseMutateCtx
|
|||||||
std::unordered_map<IdString, int> &wire_by_name;
|
std::unordered_map<IdString, int> &wire_by_name;
|
||||||
std::unordered_map<IdString, int> &pip_by_name;
|
std::unordered_map<IdString, int> &pip_by_name;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ArchMutateMethods(Arch *parent)
|
ArchMutateMethods(Arch *parent) : BaseMutateCtx(parent), parent_(parent),
|
||||||
: BaseMutateCtx(parent), parent_(parent), chip_info(parent->chip_info), bel_to_cell(parent->bel_to_cell),
|
chip_info(parent->chip_info), bel_to_cell(parent->bel_to_cell),
|
||||||
wire_to_net(parent->wire_to_net), pip_to_net(parent->pip_to_net),
|
wire_to_net(parent->wire_to_net), pip_to_net(parent->pip_to_net),
|
||||||
switches_locked(parent->switches_locked), bel_by_name(parent->bel_by_name),
|
switches_locked(parent->switches_locked),
|
||||||
wire_by_name(parent->wire_by_name), pip_by_name(parent->pip_by_name)
|
bel_by_name(parent->bel_by_name), wire_by_name(parent->wire_by_name),
|
||||||
{
|
pip_by_name(parent->pip_by_name) {}
|
||||||
}
|
|
||||||
ArchMutateMethods(ArchMutateMethods &&other) : ArchMutateMethods(other.parent_) {}
|
ArchMutateMethods(ArchMutateMethods &&other) : ArchMutateMethods(other.parent_) {}
|
||||||
ArchMutateMethods(const ArchMutateMethods &other) : ArchMutateMethods(other.parent_) {}
|
ArchMutateMethods(const ArchMutateMethods &other) : ArchMutateMethods(other.parent_) {}
|
||||||
~ArchMutateMethods() {}
|
~ArchMutateMethods() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user