Add ctx->checksum(), slightly improve log messages
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
parent
477c33efba
commit
a29bfc788e
@ -67,8 +67,10 @@ void print_utilisation(const Context *ctx)
|
|||||||
log_break();
|
log_break();
|
||||||
log_info("Device utilisation:\n");
|
log_info("Device utilisation:\n");
|
||||||
for (auto type : available_types) {
|
for (auto type : available_types) {
|
||||||
log_info("\t%20s: %5d/%5d\n", ctx->belTypeToId(type.first).c_str(ctx),
|
IdString type_id = ctx->belTypeToId(type.first);
|
||||||
get_or_default(used_types, type.first, 0), type.second);
|
int used_bels = get_or_default(used_types, type.first, 0);
|
||||||
|
log_info("\t%20s: %5d/%5d %5d%%\n", type_id.c_str(ctx),
|
||||||
|
used_bels, type.second, 100*used_bels/type.second);
|
||||||
}
|
}
|
||||||
log_break();
|
log_break();
|
||||||
}
|
}
|
||||||
|
@ -53,4 +53,127 @@ void IdString::initialize_add(const BaseCtx *ctx, const char *s, int idx)
|
|||||||
ctx->idstring_idx_to_str->push_back(&insert_rc.first->first);
|
ctx->idstring_idx_to_str->push_back(&insert_rc.first->first);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t xorshift32(uint32_t x)
|
||||||
|
{
|
||||||
|
x ^= x << 13;
|
||||||
|
x ^= x >> 17;
|
||||||
|
x ^= x << 5;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Context::checksum() const
|
||||||
|
{
|
||||||
|
uint32_t cksum = xorshift32(123456789);
|
||||||
|
|
||||||
|
uint32_t cksum_nets_sum = 0;
|
||||||
|
for (auto &it : nets)
|
||||||
|
{
|
||||||
|
auto &ni = *it.second;
|
||||||
|
uint32_t x = 123456789;
|
||||||
|
x = xorshift32(x + xorshift32(it.first.index));
|
||||||
|
x = xorshift32(x + xorshift32(ni.name.index));
|
||||||
|
if (ni.driver.cell)
|
||||||
|
x = xorshift32(x + xorshift32(ni.driver.cell->name.index));
|
||||||
|
x = xorshift32(x + xorshift32(ni.driver.port.index));
|
||||||
|
x = xorshift32(x + xorshift32(getDelayChecksum(ni.driver.budget)));
|
||||||
|
|
||||||
|
for (auto &u : ni.users) {
|
||||||
|
if (u.cell)
|
||||||
|
x = xorshift32(x + xorshift32(u.cell->name.index));
|
||||||
|
x = xorshift32(x + xorshift32(u.port.index));
|
||||||
|
x = xorshift32(x + xorshift32(getDelayChecksum(u.budget)));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t attr_x_sum = 0;
|
||||||
|
for (auto &a : ni.attrs) {
|
||||||
|
uint32_t attr_x = 123456789;
|
||||||
|
attr_x = xorshift32(attr_x + xorshift32(a.first.index));
|
||||||
|
for (uint8_t ch : a.second)
|
||||||
|
attr_x = xorshift32(attr_x + xorshift32(ch));
|
||||||
|
attr_x_sum += attr_x;
|
||||||
|
}
|
||||||
|
x = xorshift32(x + xorshift32(attr_x_sum));
|
||||||
|
|
||||||
|
uint32_t wire_x_sum = 0;
|
||||||
|
for (auto &w : ni.wires) {
|
||||||
|
uint32_t wire_x = 123456789;
|
||||||
|
wire_x = xorshift32(wire_x + xorshift32(getWireChecksum(w.first)));
|
||||||
|
wire_x = xorshift32(wire_x + xorshift32(getPipChecksum(w.second)));
|
||||||
|
wire_x_sum += wire_x;
|
||||||
|
}
|
||||||
|
x = xorshift32(x + xorshift32(wire_x_sum));
|
||||||
|
|
||||||
|
uint32_t pip_x_sum = 0;
|
||||||
|
for (auto &p : ni.pips) {
|
||||||
|
uint32_t pip_x = 123456789;
|
||||||
|
pip_x = xorshift32(pip_x + xorshift32(getPipChecksum(p.first)));
|
||||||
|
pip_x = xorshift32(pip_x + xorshift32(p.second));
|
||||||
|
pip_x_sum += pip_x;
|
||||||
|
}
|
||||||
|
x = xorshift32(x + xorshift32(pip_x_sum));
|
||||||
|
|
||||||
|
cksum_nets_sum += x;
|
||||||
|
}
|
||||||
|
cksum = xorshift32(cksum + xorshift32(cksum_nets_sum));
|
||||||
|
|
||||||
|
uint32_t cksum_cells_sum = 0;
|
||||||
|
for (auto &it : cells)
|
||||||
|
{
|
||||||
|
auto &ci = *it.second;
|
||||||
|
uint32_t x = 123456789;
|
||||||
|
x = xorshift32(x + xorshift32(it.first.index));
|
||||||
|
x = xorshift32(x + xorshift32(ci.name.index));
|
||||||
|
x = xorshift32(x + xorshift32(ci.type.index));
|
||||||
|
|
||||||
|
uint32_t port_x_sum = 0;
|
||||||
|
for (auto &p : ci.ports) {
|
||||||
|
uint32_t port_x = 123456789;
|
||||||
|
port_x = xorshift32(port_x + xorshift32(p.first.index));
|
||||||
|
port_x = xorshift32(port_x + xorshift32(p.second.name.index));
|
||||||
|
if (p.second.net)
|
||||||
|
port_x = xorshift32(port_x + xorshift32(p.second.net->name.index));
|
||||||
|
port_x = xorshift32(port_x + xorshift32(p.second.type));
|
||||||
|
port_x_sum += port_x;
|
||||||
|
}
|
||||||
|
x = xorshift32(x + xorshift32(port_x_sum));
|
||||||
|
|
||||||
|
uint32_t attr_x_sum = 0;
|
||||||
|
for (auto &a : ci.attrs) {
|
||||||
|
uint32_t attr_x = 123456789;
|
||||||
|
attr_x = xorshift32(attr_x + xorshift32(a.first.index));
|
||||||
|
for (uint8_t ch : a.second)
|
||||||
|
attr_x = xorshift32(attr_x + xorshift32(ch));
|
||||||
|
attr_x_sum += attr_x;
|
||||||
|
}
|
||||||
|
x = xorshift32(x + xorshift32(attr_x_sum));
|
||||||
|
|
||||||
|
uint32_t param_x_sum = 0;
|
||||||
|
for (auto &p : ci.params) {
|
||||||
|
uint32_t param_x = 123456789;
|
||||||
|
param_x = xorshift32(param_x + xorshift32(p.first.index));
|
||||||
|
for (uint8_t ch : p.second)
|
||||||
|
param_x = xorshift32(param_x + xorshift32(ch));
|
||||||
|
param_x_sum += param_x;
|
||||||
|
}
|
||||||
|
x = xorshift32(x + xorshift32(param_x_sum));
|
||||||
|
|
||||||
|
x = xorshift32(x + xorshift32(getBelChecksum(ci.bel)));
|
||||||
|
x = xorshift32(x + xorshift32(ci.belStrength));
|
||||||
|
|
||||||
|
uint32_t pin_x_sum = 0;
|
||||||
|
for (auto &a : ci.pins) {
|
||||||
|
uint32_t pin_x = 123456789;
|
||||||
|
pin_x = xorshift32(pin_x + xorshift32(a.first.index));
|
||||||
|
pin_x = xorshift32(pin_x + xorshift32(a.second.index));
|
||||||
|
pin_x_sum += pin_x;
|
||||||
|
}
|
||||||
|
x = xorshift32(x + xorshift32(pin_x_sum));
|
||||||
|
|
||||||
|
cksum_cells_sum += x;
|
||||||
|
}
|
||||||
|
cksum = xorshift32(cksum + xorshift32(cksum_cells_sum));
|
||||||
|
|
||||||
|
return cksum;
|
||||||
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -302,10 +302,14 @@ struct Context : Arch
|
|||||||
{
|
{
|
||||||
// xorshift64star
|
// xorshift64star
|
||||||
// https://arxiv.org/abs/1402.6246
|
// https://arxiv.org/abs/1402.6246
|
||||||
|
|
||||||
|
uint64_t retval = rngstate * 0x2545F4914F6CDD1D;
|
||||||
|
|
||||||
rngstate ^= rngstate >> 12;
|
rngstate ^= rngstate >> 12;
|
||||||
rngstate ^= rngstate << 25;
|
rngstate ^= rngstate << 25;
|
||||||
rngstate ^= rngstate >> 27;
|
rngstate ^= rngstate >> 27;
|
||||||
return rngstate * 0x2545F4914F6CDD1D;
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rng() { return rng64() & 0x3fffffff; }
|
int rng() { return rng64() & 0x3fffffff; }
|
||||||
@ -351,6 +355,8 @@ struct Context : Arch
|
|||||||
std::sort(a.begin(), a.end());
|
std::sort(a.begin(), a.end());
|
||||||
shuffle(a);
|
shuffle(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t checksum() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -480,6 +480,7 @@ bool place_design_sa(Context *ctx)
|
|||||||
{
|
{
|
||||||
SAPlacer placer(ctx);
|
SAPlacer placer(ctx);
|
||||||
placer.place();
|
placer.place();
|
||||||
|
log_info("Checksum: 0x%08x\n", ctx->checksum());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,6 +480,7 @@ bool route_design(Context *ctx)
|
|||||||
while (!netsQueue.empty()) {
|
while (!netsQueue.empty()) {
|
||||||
if (iterCnt == 200) {
|
if (iterCnt == 200) {
|
||||||
log_warning("giving up after %d iterations.\n", iterCnt);
|
log_warning("giving up after %d iterations.\n", iterCnt);
|
||||||
|
log_info("Checksum: 0x%08x\n", ctx->checksum());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -616,6 +617,7 @@ bool route_design(Context *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
log_info("routing complete after %d iterations.\n", iterCnt);
|
log_info("routing complete after %d iterations.\n", iterCnt);
|
||||||
|
log_info("Checksum: 0x%08x\n", ctx->checksum());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ static delay_t follow_net(Context *ctx, NetInfo *net, int path_length,
|
|||||||
|
|
||||||
void assign_budget(Context *ctx, float default_clock)
|
void assign_budget(Context *ctx, float default_clock)
|
||||||
{
|
{
|
||||||
|
log_break();
|
||||||
log_info("Annotating ports with timing budgets\n");
|
log_info("Annotating ports with timing budgets\n");
|
||||||
// Clear delays to a very high value first
|
// Clear delays to a very high value first
|
||||||
delay_t default_slack = delay_t(1.0e12 / default_clock);
|
delay_t default_slack = delay_t(1.0e12 / default_clock);
|
||||||
@ -117,6 +118,8 @@ void assign_budget(Context *ctx, float default_clock)
|
|||||||
net.first.c_str(ctx), ctx->getDelayNS(user.budget));
|
net.first.c_str(ctx), ctx->getDelayNS(user.budget));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_info("Checksum: 0x%08x\n", ctx->checksum());
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -34,6 +34,8 @@ BelId Arch::getBelByName(IdString name) const { return BelId(); }
|
|||||||
|
|
||||||
IdString Arch::getBelName(BelId bel) const { return IdString(); }
|
IdString Arch::getBelName(BelId bel) const { return IdString(); }
|
||||||
|
|
||||||
|
uint32_t Arch::getBelChecksum(BelId bel) const { return 0; }
|
||||||
|
|
||||||
void Arch::bindBel(BelId bel, IdString cell) {}
|
void Arch::bindBel(BelId bel, IdString cell) {}
|
||||||
|
|
||||||
void Arch::unbindBel(BelId bel) {}
|
void Arch::unbindBel(BelId bel) {}
|
||||||
@ -75,6 +77,8 @@ WireId Arch::getWireByName(IdString name) const { return WireId(); }
|
|||||||
|
|
||||||
IdString Arch::getWireName(WireId wire) const { return IdString(); }
|
IdString Arch::getWireName(WireId wire) const { return IdString(); }
|
||||||
|
|
||||||
|
uint32_t Arch::getWireChecksum(WireId wire) const { return 0; }
|
||||||
|
|
||||||
void Arch::bindWire(WireId wire, IdString net) {}
|
void Arch::bindWire(WireId wire, IdString net) {}
|
||||||
|
|
||||||
void Arch::unbindWire(WireId wire) {}
|
void Arch::unbindWire(WireId wire) {}
|
||||||
@ -98,6 +102,8 @@ PipId Arch::getPipByName(IdString name) const { return PipId(); }
|
|||||||
|
|
||||||
IdString Arch::getPipName(PipId pip) const { return IdString(); }
|
IdString Arch::getPipName(PipId pip) const { return IdString(); }
|
||||||
|
|
||||||
|
uint32_t Arch::getWireChecksum(WireId wire) const { return 0; }
|
||||||
|
|
||||||
void Arch::bindPip(PipId pip, IdString net) {}
|
void Arch::bindPip(PipId pip, IdString net) {}
|
||||||
|
|
||||||
void Arch::unbindPip(PipId pip) {}
|
void Arch::unbindPip(PipId pip) {}
|
||||||
|
@ -87,6 +87,7 @@ struct Arch : BaseCtx
|
|||||||
|
|
||||||
BelId getBelByName(IdString name) const;
|
BelId getBelByName(IdString name) const;
|
||||||
IdString getBelName(BelId bel) const;
|
IdString getBelName(BelId bel) const;
|
||||||
|
uint32_t getBelChecksum(BelId bel) const;
|
||||||
void bindBel(BelId bel, IdString cell);
|
void bindBel(BelId bel, IdString cell);
|
||||||
void unbindBel(BelId bel);
|
void unbindBel(BelId bel);
|
||||||
bool checkBelAvail(BelId bel) const;
|
bool checkBelAvail(BelId bel) const;
|
||||||
@ -100,6 +101,7 @@ struct Arch : BaseCtx
|
|||||||
|
|
||||||
WireId getWireByName(IdString name) const;
|
WireId getWireByName(IdString name) const;
|
||||||
IdString getWireName(WireId wire) const;
|
IdString getWireName(WireId wire) const;
|
||||||
|
uint32_t getWireChecksum(WireId wire) const;
|
||||||
void bindWire(WireId wire, IdString net);
|
void bindWire(WireId wire, IdString net);
|
||||||
void unbindWire(WireId wire);
|
void unbindWire(WireId wire);
|
||||||
bool checkWireAvail(WireId wire) const;
|
bool checkWireAvail(WireId wire) const;
|
||||||
@ -108,6 +110,7 @@ struct Arch : BaseCtx
|
|||||||
|
|
||||||
PipId getPipByName(IdString name) const;
|
PipId getPipByName(IdString name) const;
|
||||||
IdString getPipName(PipId pip) const;
|
IdString getPipName(PipId pip) const;
|
||||||
|
uint32_t getPipChecksum(PipId pip) const;
|
||||||
void bindPip(PipId pip, IdString net);
|
void bindPip(PipId pip, IdString net);
|
||||||
void unbindPip(PipId pip);
|
void unbindPip(PipId pip);
|
||||||
bool checkPipAvail(PipId pip) const;
|
bool checkPipAvail(PipId pip) const;
|
||||||
@ -125,6 +128,7 @@ struct Arch : BaseCtx
|
|||||||
delay_t getDelayEpsilon() const { return 0.01; }
|
delay_t getDelayEpsilon() const { return 0.01; }
|
||||||
delay_t getRipupDelayPenalty() const { return 1.0; }
|
delay_t getRipupDelayPenalty() const { return 1.0; }
|
||||||
float getDelayNS(delay_t v) const { return v; }
|
float getDelayNS(delay_t v) const { return v; }
|
||||||
|
uint32_t getDelayChecksum(delay_t v) const { return 0; }
|
||||||
|
|
||||||
std::vector<GraphicElement> getFrameGraphics() const;
|
std::vector<GraphicElement> getFrameGraphics() const;
|
||||||
std::vector<GraphicElement> getBelGraphics(BelId bel) const;
|
std::vector<GraphicElement> getBelGraphics(BelId bel) const;
|
||||||
|
@ -828,6 +828,9 @@ void parse_json_file(std::istream *&f, std::string &filename, Context *ctx)
|
|||||||
{
|
{
|
||||||
auto *parser = new JsonParser::JsonFrontend();
|
auto *parser = new JsonParser::JsonFrontend();
|
||||||
parser->execute(f, filename, ctx);
|
parser->execute(f, filename, ctx);
|
||||||
|
|
||||||
|
log_info("Checksum: 0x%08x\n", ctx->checksum());
|
||||||
|
log_break();
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
16
ice40/arch.h
16
ice40/arch.h
@ -515,6 +515,11 @@ struct Arch : 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;
|
||||||
|
}
|
||||||
|
|
||||||
void bindBel(BelId bel, IdString cell)
|
void bindBel(BelId bel, IdString cell)
|
||||||
{
|
{
|
||||||
assert(bel != BelId());
|
assert(bel != BelId());
|
||||||
@ -607,6 +612,11 @@ struct Arch : BaseCtx
|
|||||||
return id(chip_info->wire_data[wire.index].name.get());
|
return id(chip_info->wire_data[wire.index].name.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t getWireChecksum(WireId wire) const
|
||||||
|
{
|
||||||
|
return wire.index;
|
||||||
|
}
|
||||||
|
|
||||||
void bindWire(WireId wire, IdString net)
|
void bindWire(WireId wire, IdString net)
|
||||||
{
|
{
|
||||||
assert(wire != WireId());
|
assert(wire != WireId());
|
||||||
@ -646,6 +656,11 @@ struct Arch : BaseCtx
|
|||||||
PipId getPipByName(IdString name) const;
|
PipId getPipByName(IdString name) const;
|
||||||
IdString getPipName(PipId pip) const;
|
IdString getPipName(PipId pip) const;
|
||||||
|
|
||||||
|
uint32_t getPipChecksum(PipId pip) const
|
||||||
|
{
|
||||||
|
return pip.index;
|
||||||
|
}
|
||||||
|
|
||||||
void bindPip(PipId pip, IdString net)
|
void bindPip(PipId pip, IdString net)
|
||||||
{
|
{
|
||||||
assert(pip != PipId());
|
assert(pip != PipId());
|
||||||
@ -758,6 +773,7 @@ struct Arch : BaseCtx
|
|||||||
delay_t getDelayEpsilon() const { return 20; }
|
delay_t getDelayEpsilon() const { return 20; }
|
||||||
delay_t getRipupDelayPenalty() const { return 200; }
|
delay_t getRipupDelayPenalty() const { return 200; }
|
||||||
float getDelayNS(delay_t v) const { return v * 0.001; }
|
float getDelayNS(delay_t v) const { return v * 0.001; }
|
||||||
|
uint32_t getDelayChecksum(delay_t v) const { return v; }
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
|
@ -487,12 +487,14 @@ static void promote_globals(Context *ctx)
|
|||||||
// Main pack function
|
// Main pack function
|
||||||
bool pack_design(Context *ctx)
|
bool pack_design(Context *ctx)
|
||||||
{
|
{
|
||||||
|
log_break();
|
||||||
pack_constants(ctx);
|
pack_constants(ctx);
|
||||||
promote_globals(ctx);
|
promote_globals(ctx);
|
||||||
pack_io(ctx);
|
pack_io(ctx);
|
||||||
pack_lut_lutffs(ctx);
|
pack_lut_lutffs(ctx);
|
||||||
pack_nonlut_ffs(ctx);
|
pack_nonlut_ffs(ctx);
|
||||||
pack_ram(ctx);
|
pack_ram(ctx);
|
||||||
|
log_info("Checksum: 0x%08x\n", ctx->checksum());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user