Merge branch 'xc7' of gitlab.com:eddiehung/nextpnr into xc7
This commit is contained in:
commit
6985e80c01
@ -120,9 +120,10 @@ if (BUILD_PYTHON)
|
|||||||
# Original source: https://github.com/BVLC/caffe/blob/master/cmake/Dependencies.cmake#L148
|
# Original source: https://github.com/BVLC/caffe/blob/master/cmake/Dependencies.cmake#L148
|
||||||
set(version ${PYTHONLIBS_VERSION_STRING})
|
set(version ${PYTHONLIBS_VERSION_STRING})
|
||||||
|
|
||||||
STRING(REGEX REPLACE "[^0-9]" "" boost_py_version ${version})
|
STRING(REGEX REPLACE "[^0-9]" "" boost_py_version ${version})
|
||||||
find_package(Boost QUIET COMPONENTS "python-py${boost_py_version}" ${boost_libs})
|
find_package(Boost QUIET COMPONENTS "python-py${boost_py_version}" ${boost_libs})
|
||||||
set(Boost_PYTHON_FOUND ${Boost_PYTHON-PY${boost_py_version}_FOUND})
|
set(Boost_PYTHON_FOUND ${Boost_PYTHON-PY${boost_py_version}_FOUND})
|
||||||
|
set(boost_python_lib "python-py${boost_py_version}")
|
||||||
|
|
||||||
while (NOT "${version}" STREQUAL "" AND NOT Boost_PYTHON_FOUND)
|
while (NOT "${version}" STREQUAL "" AND NOT Boost_PYTHON_FOUND)
|
||||||
STRING(REGEX REPLACE "([0-9.]+).[0-9]+" "\\1" version ${version})
|
STRING(REGEX REPLACE "([0-9.]+).[0-9]+" "\\1" version ${version})
|
||||||
@ -130,6 +131,7 @@ if (BUILD_PYTHON)
|
|||||||
STRING(REGEX REPLACE "[^0-9]" "" boost_py_version ${version})
|
STRING(REGEX REPLACE "[^0-9]" "" boost_py_version ${version})
|
||||||
find_package(Boost QUIET COMPONENTS "python-py${boost_py_version}" ${boost_libs})
|
find_package(Boost QUIET COMPONENTS "python-py${boost_py_version}" ${boost_libs})
|
||||||
set(Boost_PYTHON_FOUND ${Boost_PYTHON-PY${boost_py_version}_FOUND})
|
set(Boost_PYTHON_FOUND ${Boost_PYTHON-PY${boost_py_version}_FOUND})
|
||||||
|
set(boost_python_lib "python-py${boost_py_version}")
|
||||||
|
|
||||||
STRING(REGEX MATCHALL "([0-9.]+).[0-9]+" has_more_version ${version})
|
STRING(REGEX MATCHALL "([0-9.]+).[0-9]+" has_more_version ${version})
|
||||||
if ("${has_more_version}" STREQUAL "")
|
if ("${has_more_version}" STREQUAL "")
|
||||||
@ -139,6 +141,7 @@ if (BUILD_PYTHON)
|
|||||||
|
|
||||||
if (NOT Boost_PYTHON_FOUND)
|
if (NOT Boost_PYTHON_FOUND)
|
||||||
find_package(Boost QUIET COMPONENTS python3 ${boost_libs})
|
find_package(Boost QUIET COMPONENTS python3 ${boost_libs})
|
||||||
|
set(boost_python_lib python3)
|
||||||
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
||||||
set(Boost_PYTHON_FOUND TRUE)
|
set(Boost_PYTHON_FOUND TRUE)
|
||||||
endif ()
|
endif ()
|
||||||
@ -146,6 +149,7 @@ if (BUILD_PYTHON)
|
|||||||
|
|
||||||
if (NOT Boost_PYTHON_FOUND)
|
if (NOT Boost_PYTHON_FOUND)
|
||||||
find_package(Boost QUIET COMPONENTS python36 ${boost_libs})
|
find_package(Boost QUIET COMPONENTS python36 ${boost_libs})
|
||||||
|
set(boost_python_lib python36)
|
||||||
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
||||||
set(Boost_PYTHON_FOUND TRUE)
|
set(Boost_PYTHON_FOUND TRUE)
|
||||||
endif ()
|
endif ()
|
||||||
@ -153,6 +157,7 @@ if (BUILD_PYTHON)
|
|||||||
|
|
||||||
if (NOT Boost_PYTHON_FOUND)
|
if (NOT Boost_PYTHON_FOUND)
|
||||||
find_package(Boost QUIET COMPONENTS python37 ${boost_libs})
|
find_package(Boost QUIET COMPONENTS python37 ${boost_libs})
|
||||||
|
set(boost_python_lib python37)
|
||||||
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
||||||
set(Boost_PYTHON_FOUND TRUE)
|
set(Boost_PYTHON_FOUND TRUE)
|
||||||
endif ()
|
endif ()
|
||||||
@ -161,6 +166,7 @@ if (BUILD_PYTHON)
|
|||||||
if (NOT Boost_PYTHON_FOUND)
|
if (NOT Boost_PYTHON_FOUND)
|
||||||
STRING(REGEX REPLACE "([0-9]+\\.[0-9]+).*" "\\1" gentoo_version ${PYTHONLIBS_VERSION_STRING})
|
STRING(REGEX REPLACE "([0-9]+\\.[0-9]+).*" "\\1" gentoo_version ${PYTHONLIBS_VERSION_STRING})
|
||||||
find_package(Boost QUIET COMPONENTS python-${gentoo_version} ${boost_libs})
|
find_package(Boost QUIET COMPONENTS python-${gentoo_version} ${boost_libs})
|
||||||
|
set(boost_python_lib python-${gentoo_version})
|
||||||
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
|
||||||
set(Boost_PYTHON_FOUND TRUE)
|
set(Boost_PYTHON_FOUND TRUE)
|
||||||
endif ()
|
endif ()
|
||||||
|
10
common/log.h
10
common/log.h
@ -84,4 +84,14 @@ static inline void log_assert_worker(bool cond, const char *expr, const char *fi
|
|||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
template <> struct hash<NEXTPNR_NAMESPACE_PREFIX LogLevel>
|
||||||
|
{
|
||||||
|
std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX LogLevel &loglevel) const noexcept
|
||||||
|
{
|
||||||
|
return std::hash<int>()((int)loglevel);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -50,9 +50,9 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
|
|||||||
bool Application::notify(QObject *receiver, QEvent *event)
|
bool Application::notify(QObject *receiver, QEvent *event)
|
||||||
{
|
{
|
||||||
bool retVal = true;
|
bool retVal = true;
|
||||||
try {
|
//try {
|
||||||
retVal = QApplication::notify(receiver, event);
|
retVal = QApplication::notify(receiver, event);
|
||||||
} catch (assertion_failure ex) {
|
/*} catch (assertion_failure ex) {
|
||||||
QString msg;
|
QString msg;
|
||||||
QTextStream out(&msg);
|
QTextStream out(&msg);
|
||||||
out << ex.filename.c_str() << " at " << ex.line << "\n";
|
out << ex.filename.c_str() << " at " << ex.line << "\n";
|
||||||
@ -60,7 +60,7 @@ bool Application::notify(QObject *receiver, QEvent *event)
|
|||||||
QMessageBox::critical(0, "Error", msg);
|
QMessageBox::critical(0, "Error", msg);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
QMessageBox::critical(0, "Error", "Fatal error !!!");
|
QMessageBox::critical(0, "Error", "Fatal error !!!");
|
||||||
}
|
}*/
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
gui/xc7/family.cmake
Normal file
1
gui/xc7/family.cmake
Normal file
@ -0,0 +1 @@
|
|||||||
|
include_directories(/opt/torc/src)
|
51
gui/xc7/mainwindow.cc
Normal file
51
gui/xc7/mainwindow.cc
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <miodrag@symbioticeda.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mainwindow.h"
|
||||||
|
|
||||||
|
static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
|
||||||
|
|
||||||
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
|
||||||
|
: BaseMainWindow(std::move(context), args, parent)
|
||||||
|
{
|
||||||
|
initMainResource();
|
||||||
|
|
||||||
|
std::string title = "nextpnr-xc7 - [EMPTY]";
|
||||||
|
setWindowTitle(title.c_str());
|
||||||
|
|
||||||
|
connect(this, &BaseMainWindow::contextChanged, this, &MainWindow::newContext);
|
||||||
|
|
||||||
|
createMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow() {}
|
||||||
|
|
||||||
|
void MainWindow::newContext(Context *ctx)
|
||||||
|
{
|
||||||
|
std::string title = "nextpnr-xc7 - " + ctx->getChipName();
|
||||||
|
setWindowTitle(title.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::createMenu() {}
|
||||||
|
|
||||||
|
void MainWindow::new_proj() {}
|
||||||
|
|
||||||
|
NEXTPNR_NAMESPACE_END
|
45
gui/xc7/mainwindow.h
Normal file
45
gui/xc7/mainwindow.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <miodrag@symbioticeda.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include "../basewindow.h"
|
||||||
|
|
||||||
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
class MainWindow : public BaseMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
|
||||||
|
virtual ~MainWindow();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void createMenu();
|
||||||
|
|
||||||
|
protected Q_SLOTS:
|
||||||
|
void new_proj() override;
|
||||||
|
void newContext(Context *ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
NEXTPNR_NAMESPACE_END
|
||||||
|
|
||||||
|
#endif // MAINWINDOW_H
|
2
gui/xc7/nextpnr.qrc
Normal file
2
gui/xc7/nextpnr.qrc
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<RCC>
|
||||||
|
</RCC>
|
169
xc7/arch.cc
169
xc7/arch.cc
@ -290,6 +290,9 @@ TorcInfo::TorcInfo(BaseCtx *ctx, const std::string &inDeviceName, const std::str
|
|||||||
const auto &tw = arc.getSinkTilewire();
|
const auto &tw = arc.getSinkTilewire();
|
||||||
pip_to_dst_wire.emplace_back(tilewire_to_wire(tw));
|
pip_to_dst_wire.emplace_back(tilewire_to_wire(tw));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
height = (int)tiles.getRowCount();
|
||||||
|
width = (int)tiles.getColCount();
|
||||||
}
|
}
|
||||||
TorcInfo::TorcInfo(const std::string& inDeviceName, const std::string &inPackageName)
|
TorcInfo::TorcInfo(const std::string& inDeviceName, const std::string &inPackageName)
|
||||||
: ddb(new DDB(inDeviceName, inPackageName)), sites(ddb->getSites()), tiles(ddb->getTiles()),
|
: ddb(new DDB(inDeviceName, inPackageName)), sites(ddb->getSites()), tiles(ddb->getTiles()),
|
||||||
@ -339,7 +342,8 @@ Arch::Arch(ArchArgs args) : args(args)
|
|||||||
log_error("Unsupported XC7 chip type.\n");
|
log_error("Unsupported XC7 chip type.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
width = torc_info->width;
|
||||||
|
height = torc_info->height;
|
||||||
/*if (getCtx()->verbose)*/ {
|
/*if (getCtx()->verbose)*/ {
|
||||||
log_info("Number of bels: %d\n", torc_info->num_bels);
|
log_info("Number of bels: %d\n", torc_info->num_bels);
|
||||||
log_info("Number of wires: %d\n", torc_info->num_wires);
|
log_info("Number of wires: %d\n", torc_info->num_wires);
|
||||||
@ -456,6 +460,12 @@ PortType Arch::getBelPinType(BelId bel, IdString pin) const
|
|||||||
return PORT_INOUT;
|
return PORT_INOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::pair<IdString, std::string>> Arch::getBelAttrs(BelId bel) const
|
||||||
|
{
|
||||||
|
std::vector<std::pair<IdString, std::string>> ret;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
WireId Arch::getBelPinWire(BelId bel, IdString pin) const
|
WireId Arch::getBelPinWire(BelId bel, IdString pin) const
|
||||||
{
|
{
|
||||||
auto pin_name = pin.str(this);
|
auto pin_name = pin.str(this);
|
||||||
@ -533,14 +543,14 @@ std::vector<IdString> Arch::getBelPins(BelId bel) const
|
|||||||
{
|
{
|
||||||
std::vector<IdString> ret;
|
std::vector<IdString> ret;
|
||||||
|
|
||||||
NPNR_ASSERT(bel != BelId());
|
/* NPNR_ASSERT(bel != BelId());
|
||||||
|
|
||||||
int num_bel_wires = chip_info->bel_data[bel.index].num_bel_wires;
|
int num_bel_wires = chip_info->bel_data[bel.index].num_bel_wires;
|
||||||
const BelWirePOD *bel_wires = chip_info->bel_data[bel.index].bel_wires.get();
|
const BelWirePOD *bel_wires = chip_info->bel_data[bel.index].bel_wires.get();
|
||||||
|
|
||||||
for (int i = 0; i < num_bel_wires; i++)
|
for (int i = 0; i < num_bel_wires; i++)
|
||||||
ret.push_back(IdString(bel_wires[i].port));
|
ret.push_back(IdString(bel_wires[i].port));
|
||||||
|
*/
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -600,13 +610,20 @@ IdString Arch::getWireType(WireId wire) const
|
|||||||
return IdString();
|
return IdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
std::vector<std::pair<IdString, std::string>> Arch::getWireAttrs(WireId wire) const
|
||||||
|
{
|
||||||
|
std::vector<std::pair<IdString, std::string>> ret;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
PipId Arch::getPipByName(IdString name) const
|
PipId Arch::getPipByName(IdString name) const
|
||||||
{
|
{
|
||||||
PipId ret;
|
PipId ret;
|
||||||
|
|
||||||
if (pip_by_name.empty()) {
|
/* if (pip_by_name.empty()) {
|
||||||
for (int i = 0; i < chip_info->num_pips; i++) {
|
for (int i = 0; i < chip_info->num_pips; i++) {
|
||||||
PipId pip;
|
PipId pip;
|
||||||
pip.index = i;
|
pip.index = i;
|
||||||
@ -617,7 +634,7 @@ PipId Arch::getPipByName(IdString name) const
|
|||||||
auto it = pip_by_name.find(name);
|
auto it = pip_by_name.find(name);
|
||||||
if (it != pip_by_name.end())
|
if (it != pip_by_name.end())
|
||||||
ret.index = it->second;
|
ret.index = it->second;
|
||||||
|
*/
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -647,6 +664,13 @@ IdString Arch::getPipName(PipId pip) const
|
|||||||
//#endif
|
//#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::pair<IdString, std::string>> Arch::getPipAttrs(PipId pip) const
|
||||||
|
{
|
||||||
|
std::vector<std::pair<IdString, std::string>> ret;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
BelId Arch::getPackagePinBel(const std::string &pin) const { return getBelByName(id(pin)); }
|
BelId Arch::getPackagePinBel(const std::string &pin) const { return getBelByName(id(pin)); }
|
||||||
@ -719,7 +743,7 @@ IdString Arch::getGroupName(GroupId group) const
|
|||||||
std::vector<GroupId> Arch::getGroups() const
|
std::vector<GroupId> Arch::getGroups() const
|
||||||
{
|
{
|
||||||
std::vector<GroupId> ret;
|
std::vector<GroupId> ret;
|
||||||
|
/*
|
||||||
for (int y = 0; y < chip_info->height; y++) {
|
for (int y = 0; y < chip_info->height; y++) {
|
||||||
for (int x = 0; x < chip_info->width; x++) {
|
for (int x = 0; x < chip_info->width; x++) {
|
||||||
TileType type = chip_info->tile_grid[y * chip_info->width + x];
|
TileType type = chip_info->tile_grid[y * chip_info->width + x];
|
||||||
@ -764,7 +788,7 @@ std::vector<GroupId> Arch::getGroups() const
|
|||||||
ret.push_back(group);
|
ret.push_back(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -843,137 +867,6 @@ DecalXY Arch::getGroupDecal(GroupId group) const
|
|||||||
std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decal) const
|
std::vector<GraphicElement> Arch::getDecalGraphics(DecalId decal) const
|
||||||
{
|
{
|
||||||
std::vector<GraphicElement> ret;
|
std::vector<GraphicElement> ret;
|
||||||
|
|
||||||
if (decal.type == DecalId::TYPE_GROUP) {
|
|
||||||
int type = (decal.index >> 16) & 255;
|
|
||||||
int x = (decal.index >> 8) & 255;
|
|
||||||
int y = decal.index & 255;
|
|
||||||
|
|
||||||
if (type == GroupId::TYPE_FRAME) {
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::TYPE_LINE;
|
|
||||||
el.style = GraphicElement::STYLE_FRAME;
|
|
||||||
|
|
||||||
el.x1 = x + 0.01, el.x2 = x + 0.02, el.y1 = y + 0.01, el.y2 = y + 0.01;
|
|
||||||
ret.push_back(el);
|
|
||||||
el.x1 = x + 0.01, el.x2 = x + 0.01, el.y1 = y + 0.01, el.y2 = y + 0.02;
|
|
||||||
ret.push_back(el);
|
|
||||||
|
|
||||||
el.x1 = x + 0.99, el.x2 = x + 0.98, el.y1 = y + 0.01, el.y2 = y + 0.01;
|
|
||||||
ret.push_back(el);
|
|
||||||
el.x1 = x + 0.99, el.x2 = x + 0.99, el.y1 = y + 0.01, el.y2 = y + 0.02;
|
|
||||||
ret.push_back(el);
|
|
||||||
|
|
||||||
el.x1 = x + 0.99, el.x2 = x + 0.98, el.y1 = y + 0.99, el.y2 = y + 0.99;
|
|
||||||
ret.push_back(el);
|
|
||||||
el.x1 = x + 0.99, el.x2 = x + 0.99, el.y1 = y + 0.99, el.y2 = y + 0.98;
|
|
||||||
ret.push_back(el);
|
|
||||||
|
|
||||||
el.x1 = x + 0.01, el.x2 = x + 0.02, el.y1 = y + 0.99, el.y2 = y + 0.99;
|
|
||||||
ret.push_back(el);
|
|
||||||
el.x1 = x + 0.01, el.x2 = x + 0.01, el.y1 = y + 0.99, el.y2 = y + 0.98;
|
|
||||||
ret.push_back(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type == GroupId::TYPE_MAIN_SW) {
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::TYPE_BOX;
|
|
||||||
el.style = GraphicElement::STYLE_FRAME;
|
|
||||||
|
|
||||||
el.x1 = x + main_swbox_x1;
|
|
||||||
el.x2 = x + main_swbox_x2;
|
|
||||||
el.y1 = y + main_swbox_y1;
|
|
||||||
el.y2 = y + main_swbox_y2;
|
|
||||||
ret.push_back(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type == GroupId::TYPE_LOCAL_SW) {
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::TYPE_BOX;
|
|
||||||
el.style = GraphicElement::STYLE_FRAME;
|
|
||||||
|
|
||||||
el.x1 = x + local_swbox_x1;
|
|
||||||
el.x2 = x + local_swbox_x2;
|
|
||||||
el.y1 = y + local_swbox_y1;
|
|
||||||
el.y2 = y + local_swbox_y2;
|
|
||||||
ret.push_back(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GroupId::TYPE_LC0_SW <= type && type <= GroupId::TYPE_LC7_SW) {
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::TYPE_BOX;
|
|
||||||
el.style = GraphicElement::STYLE_FRAME;
|
|
||||||
|
|
||||||
el.x1 = x + lut_swbox_x1;
|
|
||||||
el.x2 = x + lut_swbox_x2;
|
|
||||||
el.y1 = y + logic_cell_y1 + logic_cell_pitch * (type - GroupId::TYPE_LC0_SW);
|
|
||||||
el.y2 = y + logic_cell_y2 + logic_cell_pitch * (type - GroupId::TYPE_LC0_SW);
|
|
||||||
ret.push_back(el);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decal.type == DecalId::TYPE_WIRE) {
|
|
||||||
int n = chip_info->wire_data[decal.index].num_segments;
|
|
||||||
const WireSegmentPOD *p = chip_info->wire_data[decal.index].segments.get();
|
|
||||||
|
|
||||||
GraphicElement::style_t style = decal.active ? GraphicElement::STYLE_ACTIVE : GraphicElement::STYLE_INACTIVE;
|
|
||||||
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
gfxTileWire(ret, p[i].x, p[i].y, GfxTileWireId(p[i].index), style);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decal.type == DecalId::TYPE_PIP) {
|
|
||||||
const PipInfoPOD &p = chip_info->pip_data[decal.index];
|
|
||||||
GraphicElement::style_t style = decal.active ? GraphicElement::STYLE_ACTIVE : GraphicElement::STYLE_HIDDEN;
|
|
||||||
gfxTilePip(ret, p.x, p.y, GfxTileWireId(p.src_seg), GfxTileWireId(p.dst_seg), style);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decal.type == DecalId::TYPE_BEL) {
|
|
||||||
BelId bel;
|
|
||||||
bel.index = SiteIndex(decal.index);
|
|
||||||
|
|
||||||
auto bel_type = getBelType(bel);
|
|
||||||
|
|
||||||
if (bel_type == id_ICESTORM_LC) {
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::TYPE_BOX;
|
|
||||||
el.style = decal.active ? GraphicElement::STYLE_ACTIVE : GraphicElement::STYLE_INACTIVE;
|
|
||||||
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.y1 = chip_info->bel_data[bel.index].y + logic_cell_y1 +
|
|
||||||
(chip_info->bel_data[bel.index].z) * logic_cell_pitch;
|
|
||||||
el.y2 = chip_info->bel_data[bel.index].y + logic_cell_y2 +
|
|
||||||
(chip_info->bel_data[bel.index].z) * logic_cell_pitch;
|
|
||||||
ret.push_back(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bel_type == id_SB_IO) {
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::TYPE_BOX;
|
|
||||||
el.style = decal.active ? GraphicElement::STYLE_ACTIVE : GraphicElement::STYLE_INACTIVE;
|
|
||||||
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.y1 = chip_info->bel_data[bel.index].y + logic_cell_y1 +
|
|
||||||
(4 * chip_info->bel_data[bel.index].z) * logic_cell_pitch;
|
|
||||||
el.y2 = chip_info->bel_data[bel.index].y + logic_cell_y2 +
|
|
||||||
(4 * chip_info->bel_data[bel.index].z + 3) * logic_cell_pitch;
|
|
||||||
ret.push_back(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bel_type == id_ICESTORM_RAM) {
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
GraphicElement el;
|
|
||||||
el.type = GraphicElement::TYPE_BOX;
|
|
||||||
el.style = decal.active ? GraphicElement::STYLE_ACTIVE : GraphicElement::STYLE_INACTIVE;
|
|
||||||
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.y1 = chip_info->bel_data[bel.index].y + logic_cell_y1 + i;
|
|
||||||
el.y2 = chip_info->bel_data[bel.index].y + logic_cell_y2 + i + 7 * logic_cell_pitch;
|
|
||||||
ret.push_back(el);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
xc7/arch.h
12
xc7/arch.h
@ -322,6 +322,8 @@ struct TorcInfo
|
|||||||
std::vector<Arc> pip_to_arc;
|
std::vector<Arc> pip_to_arc;
|
||||||
int num_pips;
|
int num_pips;
|
||||||
std::vector<WireId> pip_to_dst_wire;
|
std::vector<WireId> pip_to_dst_wire;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
|
||||||
TorcInfo(const std::string &inDeviceName, const std::string &inPackageName);
|
TorcInfo(const std::string &inDeviceName, const std::string &inPackageName);
|
||||||
private:
|
private:
|
||||||
@ -497,6 +499,8 @@ struct Arch : BaseCtx
|
|||||||
bool fast_part;
|
bool fast_part;
|
||||||
const ChipInfoPOD *chip_info;
|
const ChipInfoPOD *chip_info;
|
||||||
const PackageInfoPOD *package_info;
|
const PackageInfoPOD *package_info;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
|
||||||
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;
|
||||||
@ -519,8 +523,8 @@ struct Arch : BaseCtx
|
|||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
int getGridDimX() const { return 34; }
|
int getGridDimX() const { return width; }
|
||||||
int getGridDimY() const { return 34; }
|
int getGridDimY() const { return height; }
|
||||||
int getTileBelDimZ(int, int) const { return 8; }
|
int getTileBelDimZ(int, int) const { return 8; }
|
||||||
int getTilePipDimZ(int, int) const { return 1; }
|
int getTilePipDimZ(int, int) const { return 1; }
|
||||||
|
|
||||||
@ -625,6 +629,8 @@ struct Arch : BaseCtx
|
|||||||
return torc_info->site_index_to_type[site_index];
|
return torc_info->site_index_to_type[site_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::pair<IdString, std::string>> getBelAttrs(BelId bel) const;
|
||||||
|
|
||||||
WireId getBelPinWire(BelId bel, IdString pin) const;
|
WireId getBelPinWire(BelId bel, IdString pin) const;
|
||||||
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;
|
||||||
@ -640,6 +646,7 @@ struct Arch : BaseCtx
|
|||||||
}
|
}
|
||||||
|
|
||||||
IdString getWireType(WireId wire) const;
|
IdString getWireType(WireId wire) const;
|
||||||
|
std::vector<std::pair<IdString, std::string>> getWireAttrs(WireId wire) const;
|
||||||
|
|
||||||
uint32_t getWireChecksum(WireId wire) const { return wire.index; }
|
uint32_t getWireChecksum(WireId wire) const { return wire.index; }
|
||||||
|
|
||||||
@ -816,6 +823,7 @@ struct Arch : BaseCtx
|
|||||||
IdString getPipName(PipId pip) const;
|
IdString getPipName(PipId pip) const;
|
||||||
|
|
||||||
IdString getPipType(PipId pip) const { return IdString(); }
|
IdString getPipType(PipId pip) const { return IdString(); }
|
||||||
|
std::vector<std::pair<IdString, std::string>> getPipAttrs(PipId pip) const;
|
||||||
|
|
||||||
uint32_t getPipChecksum(PipId pip) const { return pip.index; }
|
uint32_t getPipChecksum(PipId pip) const { return pip.index; }
|
||||||
|
|
||||||
|
@ -31,21 +31,11 @@ void arch_wrap_python()
|
|||||||
using namespace PythonConversion;
|
using namespace PythonConversion;
|
||||||
class_<ArchArgs>("ArchArgs").def_readwrite("type", &ArchArgs::type);
|
class_<ArchArgs>("ArchArgs").def_readwrite("type", &ArchArgs::type);
|
||||||
|
|
||||||
enum_<decltype(std::declval<ArchArgs>().type)>("iCE40Type")
|
|
||||||
.value("NONE", ArchArgs::NONE)
|
|
||||||
.value("LP384", ArchArgs::LP384)
|
|
||||||
.value("LP1K", ArchArgs::LP1K)
|
|
||||||
.value("LP8K", ArchArgs::LP8K)
|
|
||||||
.value("HX1K", ArchArgs::HX1K)
|
|
||||||
.value("HX8K", ArchArgs::HX8K)
|
|
||||||
.value("UP5K", ArchArgs::UP5K)
|
|
||||||
.export_values();
|
|
||||||
|
|
||||||
class_<BelId>("BelId").def_readwrite("index", &BelId::index);
|
class_<BelId>("BelId").def_readwrite("index", &BelId::index);
|
||||||
|
|
||||||
class_<WireId>("WireId").def_readwrite("index", &WireId::index);
|
class_<WireId>("WireId").def_readwrite("index", &WireId::index);
|
||||||
|
|
||||||
class_<PipId>("PipId").def_readwrite("index", &PipId::index);
|
class_<PipId>("PipId").def_readwrite("index", &PipId::index);
|
||||||
|
|
||||||
class_<BelPin>("BelPin").def_readwrite("bel", &BelPin::bel).def_readwrite("pin", &BelPin::pin);
|
class_<BelPin>("BelPin").def_readwrite("bel", &BelPin::bel).def_readwrite("pin", &BelPin::pin);
|
||||||
|
|
||||||
|
@ -48,6 +48,13 @@ template <> struct string_converter<WireId>
|
|||||||
std::string to_str(Context *ctx, WireId id) { return ctx->getWireName(id).str(ctx); }
|
std::string to_str(Context *ctx, WireId id) { return ctx->getWireName(id).str(ctx); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <> struct string_converter<const WireId>
|
||||||
|
{
|
||||||
|
WireId from_str(Context *ctx, std::string name) { return ctx->getWireByName(ctx->id(name)); }
|
||||||
|
|
||||||
|
std::string to_str(Context *ctx, WireId id) { return ctx->getWireName(id).str(ctx); }
|
||||||
|
};
|
||||||
|
|
||||||
template <> struct string_converter<PipId>
|
template <> struct string_converter<PipId>
|
||||||
{
|
{
|
||||||
PipId from_str(Context *ctx, std::string name) { return ctx->getPipByName(ctx->id(name)); }
|
PipId from_str(Context *ctx, std::string name) { return ctx->getPipByName(ctx->id(name)); }
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
include_directories(/opt/torc/src)
|
include_directories(/opt/torc/src)
|
||||||
#include_directories(torc/externals/zlib)
|
#include_directories(torc/externals/zlib)
|
||||||
|
|
||||||
find_package(Boost REQUIRED COMPONENTS serialization iostreams ${boost_libs})
|
find_package(Boost REQUIRED COMPONENTS serialization iostreams ${boost_libs} ${boost_python_lib})
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
nextpnr-${family}
|
nextpnr-${family}
|
||||||
|
Loading…
Reference in New Issue
Block a user