ice40: Use snake case for arch-specific functions
This makes the difference clearer between the general arch API that everyone must implement; and helper functions specific to one arch. Signed-off-by: D. Shah <dave@ds0.me>
This commit is contained in:
parent
9a79163eab
commit
a09a62bc4a
@ -77,29 +77,29 @@ void MainWindow::createMenu()
|
|||||||
void MainWindow::new_proj()
|
void MainWindow::new_proj()
|
||||||
{
|
{
|
||||||
QMap<QString, int> arch;
|
QMap<QString, int> arch;
|
||||||
if (Arch::isAvailable(ArchArgs::LP384))
|
if (Arch::is_available(ArchArgs::LP384))
|
||||||
arch.insert("Lattice iCE40LP384", ArchArgs::LP384);
|
arch.insert("Lattice iCE40LP384", ArchArgs::LP384);
|
||||||
if (Arch::isAvailable(ArchArgs::LP1K))
|
if (Arch::is_available(ArchArgs::LP1K))
|
||||||
arch.insert("Lattice iCE40LP1K", ArchArgs::LP1K);
|
arch.insert("Lattice iCE40LP1K", ArchArgs::LP1K);
|
||||||
if (Arch::isAvailable(ArchArgs::HX1K))
|
if (Arch::is_available(ArchArgs::HX1K))
|
||||||
arch.insert("Lattice iCE40HX1K", ArchArgs::HX1K);
|
arch.insert("Lattice iCE40HX1K", ArchArgs::HX1K);
|
||||||
if (Arch::isAvailable(ArchArgs::U1K))
|
if (Arch::is_available(ArchArgs::U1K))
|
||||||
arch.insert("Lattice iCE5LP1K", ArchArgs::U1K);
|
arch.insert("Lattice iCE5LP1K", ArchArgs::U1K);
|
||||||
if (Arch::isAvailable(ArchArgs::U2K))
|
if (Arch::is_available(ArchArgs::U2K))
|
||||||
arch.insert("Lattice iCE5LP2K", ArchArgs::U2K);
|
arch.insert("Lattice iCE5LP2K", ArchArgs::U2K);
|
||||||
if (Arch::isAvailable(ArchArgs::U4K))
|
if (Arch::is_available(ArchArgs::U4K))
|
||||||
arch.insert("Lattice iCE5LP4K", ArchArgs::U4K);
|
arch.insert("Lattice iCE5LP4K", ArchArgs::U4K);
|
||||||
if (Arch::isAvailable(ArchArgs::UP3K))
|
if (Arch::is_available(ArchArgs::UP3K))
|
||||||
arch.insert("Lattice iCE40UP3K", ArchArgs::UP3K);
|
arch.insert("Lattice iCE40UP3K", ArchArgs::UP3K);
|
||||||
if (Arch::isAvailable(ArchArgs::UP5K))
|
if (Arch::is_available(ArchArgs::UP5K))
|
||||||
arch.insert("Lattice iCE40UP5K", ArchArgs::UP5K);
|
arch.insert("Lattice iCE40UP5K", ArchArgs::UP5K);
|
||||||
if (Arch::isAvailable(ArchArgs::LP4K))
|
if (Arch::is_available(ArchArgs::LP4K))
|
||||||
arch.insert("Lattice iCE40LP4K", ArchArgs::LP4K);
|
arch.insert("Lattice iCE40LP4K", ArchArgs::LP4K);
|
||||||
if (Arch::isAvailable(ArchArgs::LP8K))
|
if (Arch::is_available(ArchArgs::LP8K))
|
||||||
arch.insert("Lattice iCE40LP8K", ArchArgs::LP8K);
|
arch.insert("Lattice iCE40LP8K", ArchArgs::LP8K);
|
||||||
if (Arch::isAvailable(ArchArgs::HX4K))
|
if (Arch::is_available(ArchArgs::HX4K))
|
||||||
arch.insert("Lattice iCE40HX4K", ArchArgs::HX4K);
|
arch.insert("Lattice iCE40HX4K", ArchArgs::HX4K);
|
||||||
if (Arch::isAvailable(ArchArgs::HX8K))
|
if (Arch::is_available(ArchArgs::HX8K))
|
||||||
arch.insert("Lattice iCE40HX8K", ArchArgs::HX8K);
|
arch.insert("Lattice iCE40HX8K", ArchArgs::HX8K);
|
||||||
|
|
||||||
bool ok;
|
bool ok;
|
||||||
@ -109,7 +109,7 @@ void MainWindow::new_proj()
|
|||||||
chipArgs.type = (ArchArgs::ArchArgsTypes)arch.value(item);
|
chipArgs.type = (ArchArgs::ArchArgsTypes)arch.value(item);
|
||||||
|
|
||||||
QStringList packages;
|
QStringList packages;
|
||||||
for (auto package : Arch::getSupportedPackages(chipArgs.type))
|
for (auto package : Arch::get_supported_packages(chipArgs.type))
|
||||||
packages.append(QLatin1String(package.data(), package.size()));
|
packages.append(QLatin1String(package.data(), package.size()));
|
||||||
QString package = QInputDialog::getItem(this, "Select package", "Package:", packages, 0, false, &ok);
|
QString package = QInputDialog::getItem(this, "Select package", "Package:", packages, 0, false, &ok);
|
||||||
|
|
||||||
|
@ -67,9 +67,9 @@ static const ChipInfoPOD *get_chip_info(ArchArgs::ArchArgsTypes chip)
|
|||||||
return ptr->get();
|
return ptr->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Arch::isAvailable(ArchArgs::ArchArgsTypes chip) { return get_chip_info(chip) != nullptr; }
|
bool Arch::is_available(ArchArgs::ArchArgsTypes chip) { return get_chip_info(chip) != nullptr; }
|
||||||
|
|
||||||
std::vector<std::string> Arch::getSupportedPackages(ArchArgs::ArchArgsTypes chip)
|
std::vector<std::string> Arch::get_supported_packages(ArchArgs::ArchArgsTypes chip)
|
||||||
{
|
{
|
||||||
const ChipInfoPOD *chip_info = get_chip_info(chip);
|
const ChipInfoPOD *chip_info = get_chip_info(chip);
|
||||||
std::vector<std::string> packages;
|
std::vector<std::string> packages;
|
||||||
@ -350,7 +350,7 @@ std::vector<IdString> Arch::getBelPins(BelId bel) const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Arch::isBelLocked(BelId bel) const
|
bool Arch::is_bel_locked(BelId bel) const
|
||||||
{
|
{
|
||||||
const BelConfigPOD *bel_config = nullptr;
|
const BelConfigPOD *bel_config = nullptr;
|
||||||
for (auto &bel_cfg : chip_info->bel_config) {
|
for (auto &bel_cfg : chip_info->bel_config) {
|
||||||
@ -493,7 +493,7 @@ std::vector<std::pair<IdString, std::string>> Arch::getPipAttrs(PipId pip) const
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
BelId Arch::getPackagePinBel(const std::string &pin) const
|
BelId Arch::get_package_pin_bel(const std::string &pin) const
|
||||||
{
|
{
|
||||||
for (auto &ppin : package_info->pins) {
|
for (auto &ppin : package_info->pins) {
|
||||||
if (ppin.name.get() == pin) {
|
if (ppin.name.get() == pin) {
|
||||||
@ -505,7 +505,7 @@ BelId Arch::getPackagePinBel(const std::string &pin) const
|
|||||||
return BelId();
|
return BelId();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Arch::getBelPackagePin(BelId bel) const
|
std::string Arch::get_bel_package_pin(BelId bel) const
|
||||||
{
|
{
|
||||||
for (auto &ppin : package_info->pins) {
|
for (auto &ppin : package_info->pins) {
|
||||||
if (ppin.bel_index == bel.index) {
|
if (ppin.bel_index == bel.index) {
|
||||||
@ -939,10 +939,10 @@ bool Arch::getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort
|
|||||||
} else if (cell->type == id_ICESTORM_RAM || cell->type == id_ICESTORM_SPRAM) {
|
} else if (cell->type == id_ICESTORM_RAM || cell->type == id_ICESTORM_SPRAM) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return getCellDelayInternal(cell, fromPort, toPort, delay);
|
return get_cell_delay_internal(cell, fromPort, toPort, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Arch::getCellDelayInternal(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const
|
bool Arch::get_cell_delay_internal(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const
|
||||||
{
|
{
|
||||||
for (auto &tc : chip_info->cell_timing) {
|
for (auto &tc : chip_info->cell_timing) {
|
||||||
if (tc.type == cell->type.index) {
|
if (tc.type == cell->type.index) {
|
||||||
@ -1094,12 +1094,12 @@ TimingClockingInfo Arch::getPortClockingInfo(const CellInfo *cell, IdString port
|
|||||||
info.clock_port = id_CLK;
|
info.clock_port = id_CLK;
|
||||||
info.edge = cell->lcInfo.negClk ? FALLING_EDGE : RISING_EDGE;
|
info.edge = cell->lcInfo.negClk ? FALLING_EDGE : RISING_EDGE;
|
||||||
if (port == id_O) {
|
if (port == id_O) {
|
||||||
bool has_clktoq = getCellDelayInternal(cell, id_CLK, id_O, info.clockToQ);
|
bool has_clktoq = get_cell_delay_internal(cell, id_CLK, id_O, info.clockToQ);
|
||||||
NPNR_ASSERT(has_clktoq);
|
NPNR_ASSERT(has_clktoq);
|
||||||
} else {
|
} else {
|
||||||
if (port == id_I0 || port == id_I1 || port == id_I2 || port == id_I3) {
|
if (port == id_I0 || port == id_I1 || port == id_I2 || port == id_I3) {
|
||||||
DelayInfo dlut;
|
DelayInfo dlut;
|
||||||
bool has_ld = getCellDelayInternal(cell, port, id_O, dlut);
|
bool has_ld = get_cell_delay_internal(cell, port, id_O, dlut);
|
||||||
NPNR_ASSERT(has_ld);
|
NPNR_ASSERT(has_ld);
|
||||||
if (args.type == ArchArgs::LP1K || args.type == ArchArgs::LP4K || args.type == ArchArgs::LP8K ||
|
if (args.type == ArchArgs::LP1K || args.type == ArchArgs::LP4K || args.type == ArchArgs::LP8K ||
|
||||||
args.type == ArchArgs::LP384) {
|
args.type == ArchArgs::LP384) {
|
||||||
@ -1124,7 +1124,7 @@ TimingClockingInfo Arch::getPortClockingInfo(const CellInfo *cell, IdString port
|
|||||||
info.edge = bool_or_default(cell->params, id("NEG_CLK_W")) ? FALLING_EDGE : RISING_EDGE;
|
info.edge = bool_or_default(cell->params, id("NEG_CLK_W")) ? FALLING_EDGE : RISING_EDGE;
|
||||||
}
|
}
|
||||||
if (cell->ports.at(port).type == PORT_OUT) {
|
if (cell->ports.at(port).type == PORT_OUT) {
|
||||||
bool has_clktoq = getCellDelayInternal(cell, info.clock_port, port, info.clockToQ);
|
bool has_clktoq = get_cell_delay_internal(cell, info.clock_port, port, info.clockToQ);
|
||||||
NPNR_ASSERT(has_clktoq);
|
NPNR_ASSERT(has_clktoq);
|
||||||
} else {
|
} else {
|
||||||
info.setup.delay = 100;
|
info.setup.delay = 100;
|
||||||
@ -1170,7 +1170,7 @@ TimingClockingInfo Arch::getPortClockingInfo(const CellInfo *cell, IdString port
|
|||||||
info.clock_port = cell->type == id_ICESTORM_SPRAM ? id_CLOCK : id_CLK;
|
info.clock_port = cell->type == id_ICESTORM_SPRAM ? id_CLOCK : id_CLK;
|
||||||
info.edge = RISING_EDGE;
|
info.edge = RISING_EDGE;
|
||||||
if (cell->ports.at(port).type == PORT_OUT) {
|
if (cell->ports.at(port).type == PORT_OUT) {
|
||||||
bool has_clktoq = getCellDelayInternal(cell, info.clock_port, port, info.clockToQ);
|
bool has_clktoq = get_cell_delay_internal(cell, info.clock_port, port, info.clockToQ);
|
||||||
if (!has_clktoq)
|
if (!has_clktoq)
|
||||||
info.clockToQ.delay = 100;
|
info.clockToQ.delay = 100;
|
||||||
} else {
|
} else {
|
||||||
@ -1194,7 +1194,7 @@ TimingClockingInfo Arch::getPortClockingInfo(const CellInfo *cell, IdString port
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Arch::isGlobalNet(const NetInfo *net) const
|
bool Arch::is_global_net(const NetInfo *net) const
|
||||||
{
|
{
|
||||||
if (net == nullptr)
|
if (net == nullptr)
|
||||||
return false;
|
return false;
|
||||||
@ -1206,7 +1206,7 @@ void Arch::assignArchInfo()
|
|||||||
{
|
{
|
||||||
for (auto &net : getCtx()->nets) {
|
for (auto &net : getCtx()->nets) {
|
||||||
NetInfo *ni = net.second.get();
|
NetInfo *ni = net.second.get();
|
||||||
if (isGlobalNet(ni))
|
if (is_global_net(ni))
|
||||||
ni->is_global = true;
|
ni->is_global = true;
|
||||||
ni->is_enable = false;
|
ni->is_enable = false;
|
||||||
ni->is_reset = false;
|
ni->is_reset = false;
|
||||||
|
22
ice40/arch.h
22
ice40/arch.h
@ -399,8 +399,8 @@ struct Arch : BaseCtx
|
|||||||
ArchArgs args;
|
ArchArgs args;
|
||||||
Arch(ArchArgs args);
|
Arch(ArchArgs args);
|
||||||
|
|
||||||
static bool isAvailable(ArchArgs::ArchArgsTypes chip);
|
static bool is_available(ArchArgs::ArchArgsTypes chip);
|
||||||
static std::vector<std::string> getSupportedPackages(ArchArgs::ArchArgsTypes chip);
|
static std::vector<std::string> get_supported_packages(ArchArgs::ArchArgsTypes chip);
|
||||||
|
|
||||||
std::string getChipName() const;
|
std::string getChipName() const;
|
||||||
|
|
||||||
@ -506,7 +506,7 @@ struct Arch : BaseCtx
|
|||||||
PortType getBelPinType(BelId bel, IdString pin) const;
|
PortType getBelPinType(BelId bel, IdString pin) const;
|
||||||
std::vector<IdString> getBelPins(BelId bel) const;
|
std::vector<IdString> getBelPins(BelId bel) const;
|
||||||
|
|
||||||
bool isBelLocked(BelId bel) const;
|
bool is_bel_locked(BelId bel) const;
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
@ -767,8 +767,8 @@ struct Arch : BaseCtx
|
|||||||
return range;
|
return range;
|
||||||
}
|
}
|
||||||
|
|
||||||
BelId getPackagePinBel(const std::string &pin) const;
|
BelId get_package_pin_bel(const std::string &pin) const;
|
||||||
std::string getBelPackagePin(BelId bel) const;
|
std::string get_bel_package_pin(BelId bel) const;
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
@ -818,15 +818,15 @@ struct Arch : BaseCtx
|
|||||||
// Get the delay through a cell from one port to another, returning false
|
// Get the delay through a cell from one port to another, returning false
|
||||||
// if no path exists. This only considers combinational delays, as required by the Arch API
|
// if no path exists. This only considers combinational delays, as required by the Arch API
|
||||||
bool getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const;
|
bool getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const;
|
||||||
// getCellDelayInternal is similar to the above, but without false path checks and including clock to out delays
|
// get_cell_delay_internal is similar to the above, but without false path checks and including clock to out delays
|
||||||
// for internal arch use only
|
// for internal arch use only
|
||||||
bool getCellDelayInternal(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const;
|
bool get_cell_delay_internal(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const;
|
||||||
// Get the port class, also setting clockInfoCount to the number of TimingClockingInfos associated with a port
|
// Get the port class, also setting clockInfoCount to the number of TimingClockingInfos associated with a port
|
||||||
TimingPortClass getPortTimingClass(const CellInfo *cell, IdString port, int &clockInfoCount) const;
|
TimingPortClass getPortTimingClass(const CellInfo *cell, IdString port, int &clockInfoCount) const;
|
||||||
// Get the TimingClockingInfo of a port
|
// Get the TimingClockingInfo of a port
|
||||||
TimingClockingInfo getPortClockingInfo(const CellInfo *cell, IdString port, int index) const;
|
TimingClockingInfo getPortClockingInfo(const CellInfo *cell, IdString port, int index) const;
|
||||||
// Return true if a port is a net
|
// Return true if a port is a net
|
||||||
bool isGlobalNet(const NetInfo *net) const;
|
bool is_global_net(const NetInfo *net) const;
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
@ -883,7 +883,7 @@ struct Arch : BaseCtx
|
|||||||
bool isBelLocationValid(BelId bel) const;
|
bool isBelLocationValid(BelId bel) const;
|
||||||
|
|
||||||
// Helper function for above
|
// Helper function for above
|
||||||
bool logicCellsCompatible(const CellInfo **it, const size_t size) const;
|
bool logic_cells_compatible(const CellInfo **it, const size_t size) const;
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
// Assign architecture-specific arguments to nets and cells, which must be
|
// Assign architecture-specific arguments to nets and cells, which must be
|
||||||
@ -893,7 +893,7 @@ struct Arch : BaseCtx
|
|||||||
void assignCellInfo(CellInfo *cell);
|
void assignCellInfo(CellInfo *cell);
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
BelPin getIOBSharingPLLPin(BelId pll, IdString pll_pin) const
|
BelPin get_iob_sharing_pll_pin(BelId pll, IdString pll_pin) const
|
||||||
{
|
{
|
||||||
auto wire = getBelPinWire(pll, pll_pin);
|
auto wire = getBelPinWire(pll, pll_pin);
|
||||||
for (auto src_bel : getWireBelPins(wire)) {
|
for (auto src_bel : getWireBelPins(wire)) {
|
||||||
@ -904,7 +904,7 @@ struct Arch : BaseCtx
|
|||||||
NPNR_ASSERT_FALSE("Expected PLL pin to share an output with an SB_IO D_IN_{0,1}");
|
NPNR_ASSERT_FALSE("Expected PLL pin to share an output with an SB_IO D_IN_{0,1}");
|
||||||
}
|
}
|
||||||
|
|
||||||
int getDrivenGlobalNetwork(BelId bel) const
|
int get_driven_glb_netwk(BelId bel) const
|
||||||
{
|
{
|
||||||
NPNR_ASSERT(getBelType(bel) == id_SB_GB);
|
NPNR_ASSERT(getBelType(bel) == id_SB_GB);
|
||||||
IdString glb_net = getWireName(getBelPinWire(bel, id_GLOBAL_BUFFER_OUTPUT))[2];
|
IdString glb_net = getWireName(getBelPinWire(bel, id_GLOBAL_BUFFER_OUTPUT))[2];
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
NEXTPNR_NAMESPACE_BEGIN
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
|
||||||
bool Arch::logicCellsCompatible(const CellInfo **it, const size_t size) const
|
bool Arch::logic_cells_compatible(const CellInfo **it, const size_t size) const
|
||||||
{
|
{
|
||||||
bool dffs_exist = false, dffs_neg = false;
|
bool dffs_exist = false, dffs_neg = false;
|
||||||
const NetInfo *cen = nullptr, *clk = nullptr, *sr = nullptr;
|
const NetInfo *cen = nullptr, *clk = nullptr, *sr = nullptr;
|
||||||
@ -81,7 +81,7 @@ bool Arch::isBelLocationValid(BelId bel) const
|
|||||||
if (ci_other != nullptr)
|
if (ci_other != nullptr)
|
||||||
bel_cells[num_cells++] = ci_other;
|
bel_cells[num_cells++] = ci_other;
|
||||||
}
|
}
|
||||||
return logicCellsCompatible(bel_cells.data(), num_cells);
|
return logic_cells_compatible(bel_cells.data(), num_cells);
|
||||||
} else {
|
} else {
|
||||||
CellInfo *ci = getBoundBelCell(bel);
|
CellInfo *ci = getBoundBelCell(bel);
|
||||||
if (ci == nullptr)
|
if (ci == nullptr)
|
||||||
@ -119,7 +119,7 @@ bool Arch::isValidBelForCell(CellInfo *cell, BelId bel) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
bel_cells[num_cells++] = cell;
|
bel_cells[num_cells++] = cell;
|
||||||
return logicCellsCompatible(bel_cells.data(), num_cells);
|
return logic_cells_compatible(bel_cells.data(), num_cells);
|
||||||
} else if (cell->type == id_SB_IO) {
|
} else if (cell->type == id_SB_IO) {
|
||||||
// Do not allow placement of input SB_IOs on blocks where there a PLL is outputting to.
|
// Do not allow placement of input SB_IOs on blocks where there a PLL is outputting to.
|
||||||
|
|
||||||
@ -195,13 +195,13 @@ bool Arch::isValidBelForCell(CellInfo *cell, BelId bel) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return getBelPackagePin(bel) != "";
|
return get_bel_package_pin(bel) != "";
|
||||||
} else if (cell->type == id_SB_GB) {
|
} else if (cell->type == id_SB_GB) {
|
||||||
if (cell->gbInfo.forPadIn)
|
if (cell->gbInfo.forPadIn)
|
||||||
return true;
|
return true;
|
||||||
NPNR_ASSERT(cell->ports.at(id_GLOBAL_BUFFER_OUTPUT).net != nullptr);
|
NPNR_ASSERT(cell->ports.at(id_GLOBAL_BUFFER_OUTPUT).net != nullptr);
|
||||||
const NetInfo *net = cell->ports.at(id_GLOBAL_BUFFER_OUTPUT).net;
|
const NetInfo *net = cell->ports.at(id_GLOBAL_BUFFER_OUTPUT).net;
|
||||||
int glb_id = getDrivenGlobalNetwork(bel);
|
int glb_id = get_driven_glb_netwk(bel);
|
||||||
if (net->is_reset && net->is_enable)
|
if (net->is_reset && net->is_enable)
|
||||||
return false;
|
return false;
|
||||||
else if (net->is_reset)
|
else if (net->is_reset)
|
||||||
|
@ -63,7 +63,7 @@ class ChainConstrainer
|
|||||||
}
|
}
|
||||||
tile.push_back(cell);
|
tile.push_back(cell);
|
||||||
chains.back().cells.push_back(cell);
|
chains.back().cells.push_back(cell);
|
||||||
bool split_chain = (!ctx->logicCellsCompatible(tile.data(), tile.size())) ||
|
bool split_chain = (!ctx->logic_cells_compatible(tile.data(), tile.size())) ||
|
||||||
(int(chains.back().cells.size()) > max_length);
|
(int(chains.back().cells.size()) > max_length);
|
||||||
if (split_chain) {
|
if (split_chain) {
|
||||||
CellInfo *passout = make_carry_pass_out((*(curr_cell - 1))->ports.at(ctx->id("COUT")));
|
CellInfo *passout = make_carry_pass_out((*(curr_cell - 1))->ports.at(ctx->id("COUT")));
|
||||||
@ -84,7 +84,7 @@ class ChainConstrainer
|
|||||||
if (!at_end) {
|
if (!at_end) {
|
||||||
// See if we need to split chain anyway
|
// See if we need to split chain anyway
|
||||||
tile.push_back(*(curr_cell + 1));
|
tile.push_back(*(curr_cell + 1));
|
||||||
bool split_chain_next = (!ctx->logicCellsCompatible(tile.data(), tile.size())) ||
|
bool split_chain_next = (!ctx->logic_cells_compatible(tile.data(), tile.size())) ||
|
||||||
(int(chains.back().cells.size()) > max_length);
|
(int(chains.back().cells.size()) > max_length);
|
||||||
tile.pop_back();
|
tile.pop_back();
|
||||||
if (split_chain_next)
|
if (split_chain_next)
|
||||||
|
@ -50,29 +50,29 @@ Ice40CommandHandler::Ice40CommandHandler(int argc, char **argv) : CommandHandler
|
|||||||
po::options_description Ice40CommandHandler::getArchOptions()
|
po::options_description Ice40CommandHandler::getArchOptions()
|
||||||
{
|
{
|
||||||
po::options_description specific("Architecture specific options");
|
po::options_description specific("Architecture specific options");
|
||||||
if (Arch::isAvailable(ArchArgs::LP384))
|
if (Arch::is_available(ArchArgs::LP384))
|
||||||
specific.add_options()("lp384", "set device type to iCE40LP384");
|
specific.add_options()("lp384", "set device type to iCE40LP384");
|
||||||
if (Arch::isAvailable(ArchArgs::LP1K))
|
if (Arch::is_available(ArchArgs::LP1K))
|
||||||
specific.add_options()("lp1k", "set device type to iCE40LP1K");
|
specific.add_options()("lp1k", "set device type to iCE40LP1K");
|
||||||
if (Arch::isAvailable(ArchArgs::LP4K))
|
if (Arch::is_available(ArchArgs::LP4K))
|
||||||
specific.add_options()("lp4k", "set device type to iCE40LP4K");
|
specific.add_options()("lp4k", "set device type to iCE40LP4K");
|
||||||
if (Arch::isAvailable(ArchArgs::LP8K))
|
if (Arch::is_available(ArchArgs::LP8K))
|
||||||
specific.add_options()("lp8k", "set device type to iCE40LP8K");
|
specific.add_options()("lp8k", "set device type to iCE40LP8K");
|
||||||
if (Arch::isAvailable(ArchArgs::HX1K))
|
if (Arch::is_available(ArchArgs::HX1K))
|
||||||
specific.add_options()("hx1k", "set device type to iCE40HX1K");
|
specific.add_options()("hx1k", "set device type to iCE40HX1K");
|
||||||
if (Arch::isAvailable(ArchArgs::HX8K))
|
if (Arch::is_available(ArchArgs::HX8K))
|
||||||
specific.add_options()("hx4k", "set device type to iCE40HX4K");
|
specific.add_options()("hx4k", "set device type to iCE40HX4K");
|
||||||
if (Arch::isAvailable(ArchArgs::HX4K))
|
if (Arch::is_available(ArchArgs::HX4K))
|
||||||
specific.add_options()("hx8k", "set device type to iCE40HX8K");
|
specific.add_options()("hx8k", "set device type to iCE40HX8K");
|
||||||
if (Arch::isAvailable(ArchArgs::UP3K))
|
if (Arch::is_available(ArchArgs::UP3K))
|
||||||
specific.add_options()("up3k", "set device type to iCE40UP3K");
|
specific.add_options()("up3k", "set device type to iCE40UP3K");
|
||||||
if (Arch::isAvailable(ArchArgs::UP5K))
|
if (Arch::is_available(ArchArgs::UP5K))
|
||||||
specific.add_options()("up5k", "set device type to iCE40UP5K");
|
specific.add_options()("up5k", "set device type to iCE40UP5K");
|
||||||
if (Arch::isAvailable(ArchArgs::U1K))
|
if (Arch::is_available(ArchArgs::U1K))
|
||||||
specific.add_options()("u1k", "set device type to iCE5LP1K");
|
specific.add_options()("u1k", "set device type to iCE5LP1K");
|
||||||
if (Arch::isAvailable(ArchArgs::U2K))
|
if (Arch::is_available(ArchArgs::U2K))
|
||||||
specific.add_options()("u2k", "set device type to iCE5LP2K");
|
specific.add_options()("u2k", "set device type to iCE5LP2K");
|
||||||
if (Arch::isAvailable(ArchArgs::U4K))
|
if (Arch::is_available(ArchArgs::U4K))
|
||||||
specific.add_options()("u4k", "set device type to iCE5LP4K");
|
specific.add_options()("u4k", "set device type to iCE5LP4K");
|
||||||
specific.add_options()("package", po::value<std::string>(), "set device package");
|
specific.add_options()("package", po::value<std::string>(), "set device package");
|
||||||
specific.add_options()("pcf", po::value<std::string>(), "PCF constraints file to ingest");
|
specific.add_options()("pcf", po::value<std::string>(), "PCF constraints file to ingest");
|
||||||
|
@ -639,7 +639,7 @@ static void promote_globals(Context *ctx)
|
|||||||
std::map<IdString, int> clock_count, reset_count, cen_count, logic_count;
|
std::map<IdString, int> clock_count, reset_count, cen_count, logic_count;
|
||||||
for (auto net : sorted(ctx->nets)) {
|
for (auto net : sorted(ctx->nets)) {
|
||||||
NetInfo *ni = net.second;
|
NetInfo *ni = net.second;
|
||||||
if (ni->driver.cell != nullptr && !ctx->isGlobalNet(ni)) {
|
if (ni->driver.cell != nullptr && !ctx->is_global_net(ni)) {
|
||||||
clock_count[net.first] = 0;
|
clock_count[net.first] = 0;
|
||||||
reset_count[net.first] = 0;
|
reset_count[net.first] = 0;
|
||||||
cen_count[net.first] = 0;
|
cen_count[net.first] = 0;
|
||||||
@ -667,7 +667,7 @@ static void promote_globals(Context *ctx)
|
|||||||
if (cell.second->attrs.find(ctx->id("BEL")) != cell.second->attrs.end()) {
|
if (cell.second->attrs.find(ctx->id("BEL")) != cell.second->attrs.end()) {
|
||||||
/* If the SB_GB is locked, doesn't matter what it drives */
|
/* If the SB_GB is locked, doesn't matter what it drives */
|
||||||
BelId bel = ctx->getBelByNameStr(cell.second->attrs[ctx->id("BEL")].as_string());
|
BelId bel = ctx->getBelByNameStr(cell.second->attrs[ctx->id("BEL")].as_string());
|
||||||
int glb_id = ctx->getDrivenGlobalNetwork(bel);
|
int glb_id = ctx->get_driven_glb_netwk(bel);
|
||||||
if ((glb_id % 2) == 0)
|
if ((glb_id % 2) == 0)
|
||||||
resets_available--;
|
resets_available--;
|
||||||
else if ((glb_id % 2) == 1)
|
else if ((glb_id % 2) == 1)
|
||||||
@ -766,11 +766,11 @@ static void place_plls(Context *ctx)
|
|||||||
for (auto bel : ctx->getBels()) {
|
for (auto bel : ctx->getBels()) {
|
||||||
if (ctx->getBelType(bel) != id_ICESTORM_PLL)
|
if (ctx->getBelType(bel) != id_ICESTORM_PLL)
|
||||||
continue;
|
continue;
|
||||||
if (ctx->isBelLocked(bel))
|
if (ctx->is_bel_locked(bel))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto io_a_pin = ctx->getIOBSharingPLLPin(bel, id_PLLOUT_A);
|
auto io_a_pin = ctx->get_iob_sharing_pll_pin(bel, id_PLLOUT_A);
|
||||||
auto io_b_pin = ctx->getIOBSharingPLLPin(bel, id_PLLOUT_B);
|
auto io_b_pin = ctx->get_iob_sharing_pll_pin(bel, id_PLLOUT_B);
|
||||||
auto gb_a = find_padin_gbuf(ctx, bel, id_PLLOUT_A_GLOBAL);
|
auto gb_a = find_padin_gbuf(ctx, bel, id_PLLOUT_A_GLOBAL);
|
||||||
auto gb_b = find_padin_gbuf(ctx, bel, id_PLLOUT_B_GLOBAL);
|
auto gb_b = find_padin_gbuf(ctx, bel, id_PLLOUT_B_GLOBAL);
|
||||||
|
|
||||||
@ -1064,7 +1064,7 @@ static BelId cell_place_unique(Context *ctx, CellInfo *ci)
|
|||||||
for (auto bel : ctx->getBels()) {
|
for (auto bel : ctx->getBels()) {
|
||||||
if (ctx->getBelType(bel) != ci->type)
|
if (ctx->getBelType(bel) != ci->type)
|
||||||
continue;
|
continue;
|
||||||
if (ctx->isBelLocked(bel))
|
if (ctx->is_bel_locked(bel))
|
||||||
continue;
|
continue;
|
||||||
IdStringList bel_name = ctx->getBelName(bel);
|
IdStringList bel_name = ctx->getBelName(bel);
|
||||||
ci->attrs[ctx->id("BEL")] = bel_name.str(ctx);
|
ci->attrs[ctx->id("BEL")] = bel_name.str(ctx);
|
||||||
|
@ -89,7 +89,7 @@ bool apply_pcf(Context *ctx, std::string filename, std::istream &in)
|
|||||||
if (!nowarn)
|
if (!nowarn)
|
||||||
log_warning("unmatched constraint '%s' (on line %d)\n", cell.c_str(), lineno);
|
log_warning("unmatched constraint '%s' (on line %d)\n", cell.c_str(), lineno);
|
||||||
} else {
|
} else {
|
||||||
BelId pin_bel = ctx->getPackagePinBel(pin);
|
BelId pin_bel = ctx->get_package_pin_bel(pin);
|
||||||
if (pin_bel == BelId())
|
if (pin_bel == BelId())
|
||||||
log_error("package does not have a pin named '%s' (on line %d)\n", pin.c_str(), lineno);
|
log_error("package does not have a pin named '%s' (on line %d)\n", pin.c_str(), lineno);
|
||||||
if (fnd_cell->second->attrs.count(ctx->id("BEL")))
|
if (fnd_cell->second->attrs.count(ctx->id("BEL")))
|
||||||
|
Loading…
Reference in New Issue
Block a user