38#include <boost/format.hpp>
48#include <unordered_map>
49#include <unordered_set>
100 class SignedVariable;
101 class UnsignedVariable;
102 class IntegerConstant;
103 class CastLogicToUnsigned;
104 class CastLogicToSigned;
105 class BinaryConstant;
126 virtual void hdl(std::ostream& stream,
Language lang,
int level) {
131 std::string(
"Attempted to generate virtual class");
132 throw std::runtime_error(err);
165 void hdl(std::ostream& stream,
Language lang,
int level)
override {
167 throw std::runtime_error(__PRETTY_FUNCTION__);
169 for (
auto&& line :
impl_) {
196 throw std::runtime_error(__PRETTY_FUNCTION__);
229 stream <<
name() <<
" : integer";
231 stream <<
"parameter integer " <<
name();
233 throw std::runtime_error(__PRETTY_FUNCTION__);
255 std::string binVal =
"";
257 for (
int i =
width_ - 1; i >= 0; --i) {
258 long power =
static_cast<long>(std::pow(2, i));
259 if (power <= tempVal) {
269 <<
" : std_logic_vector(" <<
width_ - 1
270 <<
" downto 0) := \"" << binVal <<
"\";\n";
273 <<
"localparam [" <<
width_-1 <<
":0] "
274 <<
name() <<
" = " <<
width_ <<
"'b" << binVal <<
";\n";
276 throw std::runtime_error(__PRETTY_FUNCTION__);
300 <<
" : integer := " <<
value() <<
";\n";
305 throw std::runtime_error(__PRETTY_FUNCTION__);
331 stream <<
"std_logic_vector("
332 << std::to_string(
width_ - 1)
335 stream <<
"std_logic_vector(" <<
strWidth_
336 <<
"-1 downto 0);\n";
339 stream <<
"std_logic;\n";
343 if (width_ < 0 || width_ > 1) {
345 stream <<
"[" << std::to_string(
width_ - 1) <<
":0] ";
350 stream <<
name() <<
";\n";
352 throw std::runtime_error(__PRETTY_FUNCTION__);
374 void hdl(std::ostream& stream,
Language lang,
int level)
override {
380 std::string def =
"-";
382 def =
value_.substr(0, 1);
384 std::string assign =
" <= ";
392 stream << delim << def << delim <<
";\n";
394 stream <<
"(others => '" << def <<
"');\n";
397 std::string def =
"x";
399 def =
value_.substr(0, 1);
402 <<
name() <<
" = 'b" << def <<
";\n";
404 throw std::runtime_error(__PRETTY_FUNCTION__);
432 <<
" " <<
name() <<
";\n";
434 throw std::runtime_error(__PRETTY_FUNCTION__);
443 return "(" +
width +
"-1 downto 0)";
451 return "[" +
width +
"-1:0] ";
455 throw std::runtime_error(__PRETTY_FUNCTION__);
459 std::string decl =
"reg";
529 std::string decl =
"reg signed";
558 void hdl(std::ostream& stream,
Language lang,
int level)
override {
560 throw std::runtime_error(
561 "assigning to register '" +
name() +
562 "' is only allowed in synchronous context");
564 !parentIs<Asynchronous>())) {
565 throw std::runtime_error(
"Not allowed to assign to '" +
566 name() +
"' in this context.");
574 stream <<
"(" <<
index_ <<
")";
582 if (!(parentIs<Synchronous>() || parentIs<Asynchronous>())) {
591 stream <<
"[" <<
index_ <<
"]";
599 throw std::runtime_error(__PRETTY_FUNCTION__);
629 void hdl(std::ostream& stream,
Language lang,
int level)
override {
638 throw std::runtime_error(__PRETTY_FUNCTION__);
652 template<
typename SS>
654 std::shared_ptr<SequentialStatement> ptr = std::make_shared<SS>(op);
684 void hdl(std::ostream& stream,
Language lang,
int level)
override {
690 std::string separator =
"";
692 stream << separator << std::to_string(c);
696 std::string separator =
"";
703 throw std::runtime_error(
"Case has no case");
712 std::string separator =
"";
714 stream << separator << std::to_string(c);
718 std::string separator =
"";
725 throw std::runtime_error(
"Case has no case");
727 stream <<
": begin\n";
731 throw std::runtime_error(__PRETTY_FUNCTION__);
762 void hdl(std::ostream& stream,
Language lang,
int level)
override {
776 throw std::runtime_error(__PRETTY_FUNCTION__);
789 template<
typename SS>
792 std::shared_ptr<SequentialStatement> ptr
793 = std::make_shared<SS>(ifBlock);
797 template<
typename SS>
799 std::shared_ptr<SequentialStatement> ptr
800 = std::make_shared<SS>(ifBlock);
804 template<
typename SS>
807 throw std::runtime_error(
"Cannot to add a second else block.");
809 std::shared_ptr<SequentialStatement> ptr
810 = std::make_shared<SS>(elseBlock);
824 iter->first.hdl(stream, lang);
826 iter->second->hdl(stream, lang, level + 1);
841 iter->first.hdl(stream, lang);
842 stream <<
") begin\n";
843 iter->second->hdl(stream, lang, level + 1);
851 throw std::runtime_error(__PRETTY_FUNCTION__);
859 block.second->setParent(
this);
860 block.second->build();
869 std::vector<std::pair<LHSValue,std::shared_ptr<SequentialStatement> > >
881 template<
typename SS>
883 std::shared_ptr<SequentialStatement> ptr = std::make_shared<SS>(cc);
887 void hdl(std::ostream& stream,
Language lang,
int level)
override {
893 throw std::runtime_error(__PRETTY_FUNCTION__);
906 template<
typename SS>
908 std::shared_ptr<SequentialStatement> ptr = std::make_shared<SS>(op);
913 template<
typename Var>
915 std::shared_ptr<Variable> ptr = std::make_shared<Var>(op);
919 virtual void reads(
const std::string& var)
override {
921 if (
parent() !=
nullptr) {
926 virtual void build()
override;
933 std::string separator =
"";
936 stream << separator << r;
942 v->declare(stream, lang, level + 1);
967 stream <<
" begin\n";
971 throw std::runtime_error(__PRETTY_FUNCTION__);
987 template<
typename SS>
989 std::shared_ptr<SequentialStatement> ptr = std::make_shared<SS>(op);
994 template<
typename Var>
996 std::shared_ptr<Variable> ptr = std::make_shared<Var>(op);
1000 virtual void build()
override;
1002 virtual void writes(
const std::string& var)
override {
1008 std::cerr <<
"Trying to write nonregister " << var <<
"\n";
1009 throw std::runtime_error(__PRETTY_FUNCTION__);
1023 reg.
reset(stream, lang, level + 1);
1035 stream <<
"(clk, rstx)\n";
1037 stream <<
"(clk)\n";
1041 v->declare(stream, lang, level + 1);
1048 <<
"elsif clk = '1' and clk'event then\n";
1052 <<
"if clk = '1' and clk'event then\n";
1060 <<
"end process " <<
name() <<
";\n";
1066 <<
"always @(posedge clk or negedge rstx) begin\n";
1069 <<
"always @(posedge clk) begin\n";
1072 <<
"if (~rstx) begin\n";
1077 reg.
reset(stream, lang, level + 2);
1085 throw std::runtime_error(__PRETTY_FUNCTION__);
1153 forAll([&](std::shared_ptr<Generatable> c) {
1154 c->hdl(stream, lang, level);
1177 for (
auto&& p : info.
ports) {
1181 *
this <<
Port(p.name, dir, p.left +
"+1");
1183 *
this <<
Port(p.name, dir);
1189 auto now = std::chrono::system_clock::now();
1190 auto now_c = std::chrono::system_clock::to_time_t(now);
1192 std::stringstream ss;
1195 std::vector<TCEString> licenseStrs = licenseStr.
split(
"\n");
1196 for (
unsigned int i = 0; i < licenseStrs.size(); i++) {
1199 std::strftime(buffer, 30,
"%c", std::localtime(&now_c));
1203 std::string(
"Generated on ") + ss.str());
1284 if (r.name() ==
name) {
1293 if (r.name() ==
name) {
1298 if (r.name() ==
name) {
1307 if (v->name() ==
name) {
1316 if (v->name() == var->name()) {
1317 throw std::runtime_error(
"tried to register variable " +
1318 var->name() +
" multiple times");
1326 if (v.name() ==
name) {
1331 if (v.name() ==
name) {
1336 if (v.name() ==
name) {
1340 for (
auto&& v :
wires_) {
1341 if (v->name() ==
name) {
1346 if (v->name() ==
name) {
1350 for (
auto&& v :
ports_) {
1351 if (v.name() ==
name) {
1356 throw std::runtime_error(
"Couldn't find width for " +
name);
1360 for (
auto&& v :
ports_) {
1361 if (v.name() ==
name) {
1362 return v.wireType();
1365 for (
auto&& v :
wires_) {
1366 if (v->name() ==
name) {
1367 return v->wireType();
1371 if (v->name() ==
name) {
1372 return v->wireType();
1376 throw std::runtime_error(
"Couldn't find wire type for " +
name);
1379 void reads(
const std::string& var)
final { (void)var; }
1381 void writes(
const std::string& var)
final { (void)var; }
1386 <<
name() <<
" is\n";
1389 std::string separator =
"";
1393 parameter.declare(stream, lang);
1400 std::string separator =
"";
1402 for (
auto&& port :
ports_) {
1404 port.declare(stream, lang);
1414 throw std::runtime_error(__PRETTY_FUNCTION__);
1419 std::string instance =
prefix_ +
"_" + std::to_string(
id_);
1422 << instance <<
" : " <<
name() <<
"\n";
1426 std::string separator =
"";
1430 << p.name() <<
" => " << p.strValue();
1435 std::string separator =
"";
1437 for (
auto&& p :
ports_) {
1439 << p.name() <<
" => ";
1440 if (p.name() ==
"clk" || p.name() ==
"rstx" ||
1441 p.name() ==
"glock_in") {
1444 stream << instance <<
"_" << p.name();
1453 std::string separator =
"";
1455 stream << separator;
1456 stream <<
"." << p.name() <<
"(" << p.strValue() <<
")";
1461 std::string separator =
"";
1462 stream << instance <<
" (\n";
1463 for (
auto&& p :
ports_) {
1464 stream << separator;
1467 if (p.name() ==
"clk" || p.name() ==
"rstx" ||
1468 p.name() ==
"glock_in") {
1469 stream << p.name() <<
")";
1471 stream << instance <<
"_" <<
name() <<
")";
1477 throw std::runtime_error(__PRETTY_FUNCTION__);
1488 stream << ident <<
"-- " << line <<
"\n";
1491 stream << ident <<
"\n"
1492 << ident <<
"library ieee;\n"
1493 << ident <<
"use ieee.std_logic_1164.all;\n"
1494 << ident <<
"use ieee.numeric_std.all;\n"
1495 << ident <<
"use ieee.std_logic_misc.all;\n"
1498 << ident <<
"entity " <<
name() <<
" is\n";
1501 std::string separator =
"";
1504 stream << separator;
1505 parameter.declare(stream, lang, level + 2);
1512 std::string separator =
"";
1514 for (
auto&& port :
ports_) {
1515 stream << separator;
1516 port.declare(stream, lang, level + 2);
1521 stream << ident <<
"end entity " <<
name() <<
";\n"
1524 << ident <<
"architecture rtl of "
1525 <<
name() <<
" is\n";
1531 c.declare(stream, lang, level + 1);
1534 c.declare(stream, lang, level + 1);
1540 for (
auto&& w :
wires_) {
1541 w->declare(stream, lang, level + 1);
1548 r.declare(stream, lang, level + 1);
1551 std::vector<std::string> declared;
1553 if (std::find(declared.begin(), declared.end(),
1554 m.name()) != declared.end()) {
1558 m.declare(stream, lang, level + 1);
1559 declared.emplace_back(m.name());
1564 m.instantiate(stream, lang, level + 1);
1569 b->behaviour(stream, lang, level + 1);
1573 <<
"end architecture rtl;\n\n";
1580 <<
" * " << line <<
"\n";
1588 std::string separator =
"";
1591 stream << separator;
1592 parameter.declare(stream, lang, level + 2);
1599 std::string separator =
"";
1601 for (
auto&& port :
ports_) {
1602 stream << separator;
1603 port.declare(stream, lang, level + 2);
1615 c.declare(stream, lang, level + 1);
1618 c.declare(stream, lang, level + 1);
1624 for (
auto&& w :
wires_) {
1625 w->declare(stream, lang, level + 1);
1631 v->declare(stream, lang, level + 1);
1639 r.declare(stream, lang, level + 1);
1644 m.instantiate(stream, lang, level + 1);
1649 b->behaviour(stream, lang, level + 1);
1655 throw std::runtime_error(__PRETTY_FUNCTION__);
1666 if (r.name() == var) {
1670 throw std::runtime_error(
"Couldn't find register '" + var +
"'");
1680 return l.name() == r.name();
find Finds info of the inner loops in the false
Assign(std::string var, LHSValue value, int idx)
Assign(std::string var, LHSValue value)
Assign(std::string var, LHSValue value, int ub, int lb)
void hdl(std::ostream &stream, Language lang, int level) override
Asynchronous(const std::string &name)
virtual void hdl(std::ostream &stream, Language lang, int level) override
virtual void build() override
std::vector< std::shared_ptr< Variable > > variables_
std::unordered_set< std::string > readList_
virtual void reads(const std::string &var) override
Asynchronous & operator<<(SS op)
Behaviour & operator<<(Asynchronous &rhs)
virtual ~Behaviour()=default
void behaviour(std::ostream &stream, Language lang, int level)
Behaviour & operator<<(Synchronous &rhs)
Behaviour & operator<<(Assign &&assignment)
Behaviour & operator<<(Assign &assignment)
Behaviour & operator<<(NewLine &&rhs)
Behaviour & operator<<(NewLine &rhs)
Behaviour & operator<<(Synchronous &&rhs)
int value() const noexcept
void declare(std::ostream &stream, Language lang, int level)
BinaryConstant(std::string name, int width, int value)
void hdl(std::ostream &stream, Language lang, int level) override
Case & operator<<(BinaryLiteral &rhs)
Case & operator<<(std::string &rhs)
std::vector< int > intCases_
Case(std::string stringCase)
std::vector< BinaryLiteral > binaryCases_
Case & operator<<(int rhs)
Case & operator<<(BinaryLiteral &&rhs)
Case & operator<<(std::string &&rhs)
void hdl(std::ostream &stream, Language lang, int level) override
DefaultAssign(std::string name)
DefaultAssign(std::string name, std::string value)
void hdl(std::ostream &stream, Language lang, int level) override
DefaultCase & operator<<(DefaultAssign &rhs)
DefaultCase & operator<<(DefaultAssign &&rhs)
void hdl(std::ostream &stream, Language lang, int level) override
virtual void reads(const std::string &var)
virtual Register & getRegister(const std::string &var)
Generatable * parent() const noexcept
const std::string & name() const noexcept
virtual bool isConstant(const std::string &name)
virtual void implementAll(std::ostream &stream, Language lang)
virtual WireType wireType() const
virtual void writes(const std::string &var)
void pushComponent(std::shared_ptr< Generatable > c)
void addComponent(Component c)
virtual bool isRegister(const std::string &name)
virtual bool hasOption(const std::string &var)
virtual bool isVariable(const std::string &name)
std::deque< std::string > impl_
void hdl(std::ostream &stream, Language lang, int level) override
std::vector< std::string > readList_
HDLOperation(std::string name, std::deque< std::string > impl, Language lang)
HDLOperation & operator<<(const std::string &&rhs)
HDLOperation & operator<<(const std::string &rhs)
If(LHSValue cls, SS ifBlock)
virtual void hdl(std::ostream &stream, Language lang, int level) override
void elseIfClause(LHSValue cls, SS ifBlock)
void elseClause(SS elseBlock)
std::shared_ptr< SequentialStatement > elseBlock_
std::vector< std::pair< LHSValue, std::shared_ptr< SequentialStatement > > > ifBlocks_
IntegerConstant(std::string name, int value)
int value() const noexcept
void declare(std::ostream &stream, Language lang, int level)
void hdl(std::ostream &stream, Language lang, int level)
std::string vhdlTypeDeclaration()
LogicVariable(std::string name, int width=1)
LogicVariable(std::string name, std::string width)
WireType wireType(const std::string &name) final
void implement(std::ostream &stream, Language lang, int level=0)
Module(ipxact::ModuleInfo info, int id)
Module & operator<<(Module &&rhs)
virtual bool isRegister(const std::string &name) final
Width width(const std::string &name) final
Register & getRegister(const std::string &var) final
std::vector< std::shared_ptr< Variable > > variables_
Module & operator<<(Behaviour &&rhs)
Module & operator<<(Wire &&wire)
Module & operator<<(Register &®)
std::vector< Module > modules_
void declare(std::ostream &stream, Language lang, int level)
Module & operator<<(Port &&port)
void appendToHeader(const std::string &line)
Module & operator<<(Option &&opt)
bool hasOption(const std::string &var) final
Module & operator<<(IntegerConstant &&constant)
std::vector< std::shared_ptr< Behaviour > > behaviours_
std::unordered_set< std::string > options_
Module & operator<<(BinaryConstant &&constant)
std::vector< BinaryConstant > binaryConstants_
Module & operator<<(Module &rhs)
void set_prefix(std::string prefix)
std::vector< Register > registers_
void writes(const std::string &var) final
void instantiate(std::ostream &stream, Language lang, int level)
Module & operator<<(Behaviour &rhs)
void reads(const std::string &var) final
Module & operator<<(Parameter &¶m)
std::vector< IntegerConstant > constants_
virtual bool isConstant(const std::string &name) final
virtual bool isVariable(const std::string &name) final
std::vector< std::shared_ptr< Wire > > wires_
std::vector< Parameter > parameters_
std::vector< std::string > headerComment_
void registerVariable(const std::shared_ptr< Variable > var)
std::vector< Port > ports_
Module & operator<<(Register ®)
void hdl(std::ostream &stream, Language lang, int level) final
Parameter(std::string name, std::string value)
void declare(std::ostream &stream, Language lang, int level=0)
Parameter(std::string name, int value=-1)
void hdl(std::ostream &stream, Language lang, int level) final
RawCodeLine(std::string vhdl, std::string verilog)
void reset(std::ostream &stream, Language lang, int ident)
ResetOption resetOption() const noexcept
virtual void hdl(std::ostream &stream, Language lang, int level)
SequentialStatement(std::string name)
std::string verilogTypeDeclaration()
std::string vhdlTypeDeclaration()
SignedVariable(std::string name, std::string width)
SignedVariable(std::string name, int width=1)
void addCase(DefaultCase rhs)
void hdl(std::ostream &stream, Language lang, int level) override
virtual void build() override
std::unordered_set< std::string > registers_
Synchronous(std::string name)
virtual void hdl(std::ostream &stream, Language lang, int level) override
virtual void writes(const std::string &var) override
virtual void vhdlReset(std::ostream &stream, Language lang, int level)
Synchronous & operator<<(SS op)
std::vector< std::shared_ptr< Variable > > variables_
UnsignedVariable(std::string name, int width=1)
std::string vhdlTypeDeclaration()
UnsignedVariable(std::string name, std::string width)
Variable(std::string name, int width=1)
std::string verilogRange()
void declare(std::ostream &stream, Language lang, int level)
virtual std::string vhdlTypeDeclaration()
std::string verilogTypeDeclaration()
Variable(std::string name, std::string width)
Wire(std::string name, std::string width)
void declare(std::ostream &stream, Language lang, int ident)
Wire(std::string name, int width=1, WireType wt=WireType::Auto)
WireType wireType() const final
static std::string generateMITLicense(const std::string &year, const std::string &comment)
std::vector< TCEString > split(const std::string &delim) const
std::vector< Parameter > parameters
std::vector< Port > ports