aboutsummaryrefslogtreecommitdiffstats
path: root/ecp5/arch.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ecp5/arch.cc')
-rw-r--r--ecp5/arch.cc64
1 files changed, 57 insertions, 7 deletions
diff --git a/ecp5/arch.cc b/ecp5/arch.cc
index 23105df2..14b5b8f2 100644
--- a/ecp5/arch.cc
+++ b/ecp5/arch.cc
@@ -21,6 +21,7 @@
#include <algorithm>
#include <cmath>
#include <cstring>
+#include "gfx.h"
#include "log.h"
#include "nextpnr.h"
#include "placer1.h"
@@ -140,9 +141,8 @@ Arch::Arch(ArchArgs args) : args(args)
// -----------------------------------------------------------------------
-std::string Arch::getChipName()
+std::string Arch::getChipName() const
{
-
if (args.type == ArchArgs::LFE5U_25F) {
return "LFE5U-25F";
} else if (args.type == ArchArgs::LFE5U_45F) {
@@ -422,6 +422,8 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const;
return 200 * (abs(driver_loc.x - sink_loc.x) + abs(driver_loc.y - sink_loc.y));
}
+delay_t Arch::getBudgetOverride(NetInfo *net_info, int user_idx, delay_t budget) const { return budget; }
+
// -----------------------------------------------------------------------
bool Arch::place() { return placer1(getCtx()); }
@@ -430,16 +432,64 @@ bool Arch::route() { return router1(getCtx()); }
// -----------------------------------------------------------------------
-std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decalId) const
+std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decal) const
{
std::vector<GraphicElement> ret;
- // FIXME
+
+ if (decal.type == DecalId::TYPE_FRAME) {
+ /* nothing */
+ }
+
+ if (decal.type == DecalId::TYPE_BEL) {
+ BelId bel;
+ bel.index = decal.z;
+ bel.location = decal.location;
+ int z = locInfo(bel)->bel_data[bel.index].z;
+ auto bel_type = getBelType(bel);
+
+ if (bel_type == TYPE_TRELLIS_SLICE) {
+ GraphicElement el;
+ el.type = GraphicElement::TYPE_BOX;
+ el.style = decal.active ? GraphicElement::STYLE_ACTIVE : GraphicElement::STYLE_INACTIVE;
+ el.x1 = bel.location.x + logic_cell_x1;
+ el.x2 = bel.location.x + logic_cell_x2;
+ el.y1 = bel.location.y + logic_cell_y1 + (z)*logic_cell_pitch;
+ el.y2 = bel.location.y + logic_cell_y2 + (z)*logic_cell_pitch;
+ ret.push_back(el);
+ }
+
+ if (bel_type == TYPE_TRELLIS_IO) {
+ GraphicElement el;
+ el.type = GraphicElement::TYPE_BOX;
+ el.style = decal.active ? GraphicElement::STYLE_ACTIVE : GraphicElement::STYLE_INACTIVE;
+ el.x1 = bel.location.x + logic_cell_x1;
+ el.x2 = bel.location.x + logic_cell_x2;
+ el.y1 = bel.location.y + logic_cell_y1 + (2 * z) * logic_cell_pitch;
+ el.y2 = bel.location.y + logic_cell_y2 + (2 * z + 1) * logic_cell_pitch;
+ ret.push_back(el);
+ }
+ }
+
return ret;
}
-DecalXY Arch::getFrameDecal() const { return {}; }
+DecalXY Arch::getFrameDecal() const
+{
+ DecalXY decalxy;
+ decalxy.decal.type = DecalId::TYPE_FRAME;
+ decalxy.decal.active = true;
+ return decalxy;
+}
-DecalXY Arch::getBelDecal(BelId bel) const { return {}; }
+DecalXY Arch::getBelDecal(BelId bel) const
+{
+ DecalXY decalxy;
+ decalxy.decal.type = DecalId::TYPE_BEL;
+ decalxy.decal.location = bel.location;
+ decalxy.decal.z = bel.index;
+ decalxy.decal.active = bel_to_cell.count(bel) && (bel_to_cell.at(bel) != IdString());
+ return decalxy;
+}
DecalXY Arch::getWireDecal(WireId wire) const { return {}; }
@@ -449,7 +499,7 @@ DecalXY Arch::getGroupDecal(GroupId pip) const { return {}; };
// -----------------------------------------------------------------------
-bool Arch::getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort, delay_t &delay) const
+bool Arch::getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const
{
return false;
}