nexus: Initial PDC parser integration
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
12013b4c1f
commit
69b449c875
@ -1444,7 +1444,7 @@ struct Arch : BaseCtx
|
|||||||
// List of IO constraints, used by PDC parser
|
// List of IO constraints, used by PDC parser
|
||||||
std::unordered_map<IdString, std::unordered_map<IdString, Property>> io_attr;
|
std::unordered_map<IdString, std::unordered_map<IdString, Property>> io_attr;
|
||||||
|
|
||||||
void parse_pdc(std::istream &in) const;
|
void read_pdc(std::istream &in);
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
void write_fasm(std::ostream &out) const;
|
void write_fasm(std::ostream &out) const;
|
||||||
|
@ -50,6 +50,7 @@ po::options_description NexusCommandHandler::getArchOptions()
|
|||||||
specific.add_options()("chipdb", po::value<std::string>(), "name of chip database binary");
|
specific.add_options()("chipdb", po::value<std::string>(), "name of chip database binary");
|
||||||
specific.add_options()("device", po::value<std::string>(), "device name");
|
specific.add_options()("device", po::value<std::string>(), "device name");
|
||||||
specific.add_options()("fasm", po::value<std::string>(), "fasm file to write");
|
specific.add_options()("fasm", po::value<std::string>(), "fasm file to write");
|
||||||
|
specific.add_options()("pdc", po::value<std::string>(), "physical constraints file");
|
||||||
return specific;
|
return specific;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +73,16 @@ std::unique_ptr<Context> NexusCommandHandler::createContext(std::unordered_map<s
|
|||||||
return std::unique_ptr<Context>(new Context(chipArgs));
|
return std::unique_ptr<Context>(new Context(chipArgs));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NexusCommandHandler::customAfterLoad(Context *ctx) {}
|
void NexusCommandHandler::customAfterLoad(Context *ctx)
|
||||||
|
{
|
||||||
|
if (vm.count("pdc")) {
|
||||||
|
std::string filename = vm["pdc"].as<std::string>();
|
||||||
|
std::ifstream in(filename);
|
||||||
|
if (!in)
|
||||||
|
log_error("Failed to open input PDC file %s.\n", filename.c_str());
|
||||||
|
ctx->read_pdc(in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
44
nexus/pdc.cc
44
nexus/pdc.cc
@ -21,6 +21,8 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "nextpnr.h"
|
#include "nextpnr.h"
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_BEGIN
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
|
||||||
struct TCLEntity
|
struct TCLEntity
|
||||||
@ -76,6 +78,8 @@ struct PDCParser
|
|||||||
int lineno = 1;
|
int lineno = 1;
|
||||||
Context *ctx;
|
Context *ctx;
|
||||||
|
|
||||||
|
PDCParser(const std::string &buf, Context *ctx) : buf(buf), ctx(ctx){};
|
||||||
|
|
||||||
inline bool eof() const { return pos == int(buf.size()); }
|
inline bool eof() const { return pos == int(buf.size()); }
|
||||||
|
|
||||||
inline char peek() const { return buf.at(pos); }
|
inline char peek() const { return buf.at(pos); }
|
||||||
@ -193,10 +197,14 @@ struct PDCParser
|
|||||||
const std::string &cmd = arg0.str;
|
const std::string &cmd = arg0.str;
|
||||||
if (cmd == "get_ports")
|
if (cmd == "get_ports")
|
||||||
return cmd_get_ports(arguments);
|
return cmd_get_ports(arguments);
|
||||||
|
else if (cmd == "get_cells")
|
||||||
|
return cmd_get_cells(arguments);
|
||||||
else if (cmd == "ldc_set_location")
|
else if (cmd == "ldc_set_location")
|
||||||
return cmd_ldc_set_location(arguments);
|
return cmd_ldc_set_location(arguments);
|
||||||
else if (cmd == "ldc_set_port")
|
else if (cmd == "ldc_set_port")
|
||||||
return cmd_ldc_set_port(arguments);
|
return cmd_ldc_set_port(arguments);
|
||||||
|
else
|
||||||
|
log_error("Unsupported PDC command '%s'\n", cmd.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<TCLValue> get_arguments()
|
std::vector<TCLValue> get_arguments()
|
||||||
@ -208,6 +216,8 @@ struct PDCParser
|
|||||||
auto result = evaluate(get_arguments());
|
auto result = evaluate(get_arguments());
|
||||||
NPNR_ASSERT(check_get(']'));
|
NPNR_ASSERT(check_get(']'));
|
||||||
args.push_back(result);
|
args.push_back(result);
|
||||||
|
} else if (peek() == ']') {
|
||||||
|
break;
|
||||||
} else {
|
} else {
|
||||||
args.push_back(get_str());
|
args.push_back(get_str());
|
||||||
}
|
}
|
||||||
@ -233,6 +243,23 @@ struct PDCParser
|
|||||||
return ports;
|
return ports;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TCLValue cmd_get_cells(const std::vector<TCLValue> &arguments)
|
||||||
|
{
|
||||||
|
std::vector<TCLEntity> cells;
|
||||||
|
for (int i = 1; i < int(arguments.size()); i++) {
|
||||||
|
auto &arg = arguments.at(i);
|
||||||
|
if (!arg.is_string)
|
||||||
|
log_error("get_cells expected string arguments (line %d)\n", lineno);
|
||||||
|
std::string s = arg.str;
|
||||||
|
if (s.at(0) == '-')
|
||||||
|
log_error("unsupported argument '%s' to get_cells (line %d)\n", s.c_str(), lineno);
|
||||||
|
IdString id = ctx->id(s);
|
||||||
|
if (ctx->cells.count(id))
|
||||||
|
cells.emplace_back(TCLEntity::ENTITY_CELL, id);
|
||||||
|
}
|
||||||
|
return cells;
|
||||||
|
}
|
||||||
|
|
||||||
TCLValue cmd_ldc_set_location(const std::vector<TCLValue> &arguments)
|
TCLValue cmd_ldc_set_location(const std::vector<TCLValue> &arguments)
|
||||||
{
|
{
|
||||||
std::string site;
|
std::string site;
|
||||||
@ -296,6 +323,23 @@ struct PDCParser
|
|||||||
}
|
}
|
||||||
return std::string{};
|
return std::string{};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void operator()()
|
||||||
|
{
|
||||||
|
while (!eof()) {
|
||||||
|
skip_blank(true);
|
||||||
|
auto args = get_arguments();
|
||||||
|
if (args.empty())
|
||||||
|
continue;
|
||||||
|
evaluate(args);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void Arch::read_pdc(std::istream &in)
|
||||||
|
{
|
||||||
|
std::string buf(std::istreambuf_iterator<char>(in), {});
|
||||||
|
PDCParser(buf, getCtx())();
|
||||||
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
Loading…
Reference in New Issue
Block a user