yosys-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
rtlil.cc File Reference
#include "kernel/yosys.h"
#include "kernel/macc.h"
#include "frontends/verilog/verilog_frontend.h"
#include "backends/ilang/ilang_backend.h"
#include <string.h>
#include <algorithm>
+ Include dependency graph for rtlil.cc:

Go to the source code of this file.

Macros

#define DEF_METHOD(_func, _y_size, _type)
 
#define DEF_METHOD(_func, _y_size, _type)
 
#define DEF_METHOD(_func, _type, _pmux)
 
#define DEF_METHOD_2(_func, _type, _P1, _P2)
 
#define DEF_METHOD_3(_func, _type, _P1, _P2, _P3)
 
#define DEF_METHOD_4(_func, _type, _P1, _P2, _P3, _P4)
 
#define DEF_METHOD_5(_func, _type, _P1, _P2, _P3, _P4, _P5)
 
#define DJB2(_hash, _value)   (_hash) = (((_hash) << 5) + (_hash)) + (_value)
 

Functions

static bool fixup_ports_compare (const RTLIL::Wire *a, const RTLIL::Wire *b)
 
 DEF_METHOD (And, std::max(sig_a.size(), sig_b.size()),"$and") DEF_METHOD(Or
 
$or DEF_METHOD (Xor, std::max(sig_a.size(), sig_b.size()),"$xor") DEF_METHOD(Xnor
 
$or $xnor DEF_METHOD (Add, std::max(sig_a.size(), sig_b.size()),"$add") DEF_METHOD(Sub
 
$or $xnor $sub DEF_METHOD (Mul, std::max(sig_a.size(), sig_b.size()),"$mul") DEF_METHOD(Div
 
$or $xnor $sub $div DEF_METHOD (Mod, std::max(sig_a.size(), sig_b.size()),"$mod") RTLIL
 
static void sigspec_parse_split (std::vector< std::string > &tokens, const std::string &text, char sep)
 
static int sigspec_parse_get_dummy_line_num ()
 

Macro Definition Documentation

#define DEF_METHOD (   _func,
  _y_size,
  _type 
)
Value:
RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed) { \
RTLIL::Cell *cell = addCell(name, _type); \
cell->parameters["\\A_SIGNED"] = is_signed; \
cell->parameters["\\A_WIDTH"] = sig_a.size(); \
cell->parameters["\\Y_WIDTH"] = sig_y.size(); \
cell->setPort("\\A", sig_a); \
cell->setPort("\\Y", sig_y); \
return cell; \
} \
RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed) { \
RTLIL::SigSpec sig_y = addWire(NEW_ID, _y_size); \
add ## _func(name, sig_a, sig_y, is_signed); \
return sig_y; \
}
int size() const
Definition: rtlil.h:1019
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
Definition: rtlil.cc:1331
#define NEW_ID
Definition: yosys.h:166

Definition at line 1397 of file rtlil.cc.

#define DEF_METHOD (   _func,
  _y_size,
  _type 
)
Value:
RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed) { \
RTLIL::Cell *cell = addCell(name, _type); \
cell->parameters["\\A_SIGNED"] = is_signed; \
cell->parameters["\\B_SIGNED"] = is_signed; \
cell->parameters["\\A_WIDTH"] = sig_a.size(); \
cell->parameters["\\B_WIDTH"] = sig_b.size(); \
cell->parameters["\\Y_WIDTH"] = sig_y.size(); \
cell->setPort("\\A", sig_a); \
cell->setPort("\\B", sig_b); \
cell->setPort("\\Y", sig_y); \
return cell; \
} \
RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed) { \
RTLIL::SigSpec sig_y = addWire(NEW_ID, _y_size); \
add ## _func(name, sig_a, sig_b, sig_y, is_signed); \
return sig_y; \
}
int size() const
Definition: rtlil.h:1019
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
Definition: rtlil.cc:1331
#define NEW_ID
Definition: yosys.h:166

Definition at line 1397 of file rtlil.cc.

#define DEF_METHOD (   _func,
  _type,
  _pmux 
)
Value:
RTLIL::Cell *cell = addCell(name, _type); \
cell->parameters["\\WIDTH"] = sig_a.size(); \
if (_pmux) cell->parameters["\\S_WIDTH"] = sig_s.size(); \
cell->setPort("\\A", sig_a); \
cell->setPort("\\B", sig_b); \
cell->setPort("\\S", sig_s); \
cell->setPort("\\Y", sig_y); \
return cell; \
} \
RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s) { \
RTLIL::SigSpec sig_y = addWire(NEW_ID, sig_a.size()); \
add ## _func(name, sig_a, sig_b, sig_s, sig_y); \
return sig_y; \
}
int size() const
Definition: rtlil.h:1019
if(!(yy_init))
Definition: ilang_lexer.cc:846
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
#define NEW_ID
Definition: yosys.h:166

Definition at line 1397 of file rtlil.cc.

#define DEF_METHOD_2 (   _func,
  _type,
  _P1,
  _P2 
)
Value:
RTLIL::Cell *cell = addCell(name, _type); \
cell->setPort("\\" #_P1, sig1); \
cell->setPort("\\" #_P2, sig2); \
return cell; \
} \
RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1) { \
RTLIL::SigBit sig2 = addWire(NEW_ID); \
add ## _func(name, sig1, sig2); \
return sig2; \
}
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
Definition: rtlil.cc:1331
#define NEW_ID
Definition: yosys.h:166
#define DEF_METHOD_3 (   _func,
  _type,
  _P1,
  _P2,
  _P3 
)
Value:
RTLIL::Cell *cell = addCell(name, _type); \
cell->setPort("\\" #_P1, sig1); \
cell->setPort("\\" #_P2, sig2); \
cell->setPort("\\" #_P3, sig3); \
return cell; \
} \
RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2) { \
RTLIL::SigBit sig3 = addWire(NEW_ID); \
add ## _func(name, sig1, sig2, sig3); \
return sig3; \
}
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
Definition: rtlil.cc:1331
#define NEW_ID
Definition: yosys.h:166
#define DEF_METHOD_4 (   _func,
  _type,
  _P1,
  _P2,
  _P3,
  _P4 
)
Value:
RTLIL::Cell *cell = addCell(name, _type); \
cell->setPort("\\" #_P1, sig1); \
cell->setPort("\\" #_P2, sig2); \
cell->setPort("\\" #_P3, sig3); \
cell->setPort("\\" #_P4, sig4); \
return cell; \
} \
RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3) { \
RTLIL::SigBit sig4 = addWire(NEW_ID); \
add ## _func(name, sig1, sig2, sig3, sig4); \
return sig4; \
}
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
Definition: rtlil.cc:1331
#define NEW_ID
Definition: yosys.h:166
#define DEF_METHOD_5 (   _func,
  _type,
  _P1,
  _P2,
  _P3,
  _P4,
  _P5 
)
Value:
RTLIL::Cell *cell = addCell(name, _type); \
cell->setPort("\\" #_P1, sig1); \
cell->setPort("\\" #_P2, sig2); \
cell->setPort("\\" #_P3, sig3); \
cell->setPort("\\" #_P4, sig4); \
cell->setPort("\\" #_P5, sig5); \
return cell; \
} \
RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4) { \
RTLIL::SigBit sig5 = addWire(NEW_ID); \
add ## _func(name, sig1, sig2, sig3, sig4, sig5); \
return sig5; \
}
void add(RTLIL::Wire *wire)
Definition: rtlil.cc:1113
RTLIL::Wire * addWire(RTLIL::IdString name, int width=1)
Definition: rtlil.cc:1331
#define NEW_ID
Definition: yosys.h:166
#define DJB2 (   _hash,
  _value 
)    (_hash) = (((_hash) << 5) + (_hash)) + (_value)

Definition at line 2257 of file rtlil.cc.

Function Documentation

DEF_METHOD ( And  ,
std::  maxsig_a.size(), sig_b.size(),
"$and"   
)
$or DEF_METHOD ( Xor  ,
std::  maxsig_a.size(), sig_b.size(),
"$xor"   
)
$or $xnor DEF_METHOD ( Add  ,
std::  maxsig_a.size(), sig_b.size(),
"$add"   
)
$or $xnor $sub DEF_METHOD ( Mul  ,
std::  maxsig_a.size(), sig_b.size(),
"$mul"   
)
$or $xnor $sub $div DEF_METHOD ( Mod  ,
std::  maxsig_a.size(), sig_b.size(),
"$mod"   
)

Definition at line 1437 of file rtlil.cc.

1443  { \
1444  RTLIL::Cell *cell = addCell(name, _type); \
1445  cell->parameters["\\WIDTH"] = sig_a.size(); \
1446  if (_pmux) cell->parameters["\\S_WIDTH"] = sig_s.size(); \
1447  cell->setPort("\\A", sig_a); \
1448  cell->setPort("\\B", sig_b); \
1449  cell->setPort("\\S", sig_s); \
1450  cell->setPort("\\Y", sig_y); \
1451  return cell; \
1452  } \
1453  RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s) { \
1454  RTLIL::SigSpec sig_y = addWire(NEW_ID, sig_a.size()); \
1455  add ## _func(name, sig_a, sig_b, sig_s, sig_y); \
1456  return sig_y; \
1457  }
1458 DEF_METHOD(Mux, "$mux", 0)
1459 DEF_METHOD(Pmux, "$pmux", 1)
1460 #undef DEF_METHOD
1461 
1462 #define DEF_METHOD_2(_func, _type, _P1, _P2) \
1463  RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2) { \
1464  RTLIL::Cell *cell = addCell(name, _type); \
1465  cell->setPort("\\" #_P1, sig1); \
1466  cell->setPort("\\" #_P2, sig2); \
1467  return cell; \
1468  } \
1469  RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1) { \
1470  RTLIL::SigBit sig2 = addWire(NEW_ID); \
1471  add ## _func(name, sig1, sig2); \
1472  return sig2; \
1473  }
1474 #define DEF_METHOD_3(_func, _type, _P1, _P2, _P3) \
1475  RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3) { \
1476  RTLIL::Cell *cell = addCell(name, _type); \
1477  cell->setPort("\\" #_P1, sig1); \
1478  cell->setPort("\\" #_P2, sig2); \
1479  cell->setPort("\\" #_P3, sig3); \
1480  return cell; \
1481  } \
1482  RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2) { \
1483  RTLIL::SigBit sig3 = addWire(NEW_ID); \
1484  add ## _func(name, sig1, sig2, sig3); \
1485  return sig3; \
1486  }
1487 #define DEF_METHOD_4(_func, _type, _P1, _P2, _P3, _P4) \
1488  RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4) { \
1489  RTLIL::Cell *cell = addCell(name, _type); \
1490  cell->setPort("\\" #_P1, sig1); \
1491  cell->setPort("\\" #_P2, sig2); \
1492  cell->setPort("\\" #_P3, sig3); \
1493  cell->setPort("\\" #_P4, sig4); \
1494  return cell; \
1495  } \
1496  RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3) { \
1497  RTLIL::SigBit sig4 = addWire(NEW_ID); \
1498  add ## _func(name, sig1, sig2, sig3, sig4); \
1499  return sig4; \
1500  }
1501 #define DEF_METHOD_5(_func, _type, _P1, _P2, _P3, _P4, _P5) \
1502  RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4, RTLIL::SigBit sig5) { \
1503  RTLIL::Cell *cell = addCell(name, _type); \
1504  cell->setPort("\\" #_P1, sig1); \
1505  cell->setPort("\\" #_P2, sig2); \
1506  cell->setPort("\\" #_P3, sig3); \
1507  cell->setPort("\\" #_P4, sig4); \
1508  cell->setPort("\\" #_P5, sig5); \
1509  return cell; \
1510  } \
1511  RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4) { \
1512  RTLIL::SigBit sig5 = addWire(NEW_ID); \
1513  add ## _func(name, sig1, sig2, sig3, sig4, sig5); \
1514  return sig5; \
1515  }
1516 DEF_METHOD_2(NotGate, "$_NOT_", A, Y)
1517 DEF_METHOD_3(AndGate, "$_AND_", A, B, Y)
1518 DEF_METHOD_3(NandGate, "$_NAND_", A, B, Y)
1519 DEF_METHOD_3(OrGate, "$_OR_", A, B, Y)
1520 DEF_METHOD_3(NorGate, "$_NOR_", A, B, Y)
1521 DEF_METHOD_3(XorGate, "$_XOR_", A, B, Y)
1522 DEF_METHOD_3(XnorGate, "$_XNOR_", A, B, Y)
1523 DEF_METHOD_4(MuxGate, "$_MUX_", A, B, S, Y)
1524 DEF_METHOD_4(Aoi3Gate, "$_AOI3_", A, B, C, Y)
1525 DEF_METHOD_4(Oai3Gate, "$_OAI3_", A, B, C, Y)
1526 DEF_METHOD_5(Aoi4Gate, "$_AOI4_", A, B, C, D, Y)
1527 DEF_METHOD_5(Oai4Gate, "$_OAI4_", A, B, C, D, Y)
1528 #undef DEF_METHOD_2
1529 #undef DEF_METHOD_3
1530 #undef DEF_METHOD_4
1531 #undef DEF_METHOD_5
1532 
1533 RTLIL::Cell* RTLIL::Module::addPow(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed, bool b_signed)
1534 {
1535  RTLIL::Cell *cell = addCell(name, "$pow");
1536  cell->parameters["\\A_SIGNED"] = a_signed;
1537  cell->parameters["\\B_SIGNED"] = b_signed;
1538  cell->parameters["\\A_WIDTH"] = sig_a.size();
1539  cell->parameters["\\B_WIDTH"] = sig_b.size();
1540  cell->parameters["\\Y_WIDTH"] = sig_y.size();
1541  cell->setPort("\\A", sig_a);
1542  cell->setPort("\\B", sig_b);
1543  cell->setPort("\\Y", sig_y);
1544  return cell;
1545 }
#define DEF_METHOD_3(_func, _type, _P1, _P2, _P3)
RTLIL::Cell * addCell(RTLIL::IdString name, RTLIL::IdString type)
Definition: rtlil.cc:1353
void setPort(RTLIL::IdString portname, RTLIL::SigSpec signal)
Definition: rtlil.cc:1789
std::map< RTLIL::IdString, RTLIL::Const > parameters
Definition: rtlil.h:856
int size() const
Definition: rtlil.h:1019
#define DEF_METHOD_5(_func, _type, _P1, _P2, _P3, _P4, _P5)
#define DEF_METHOD(_func, _y_size, _type)
Definition: rtlil.cc:1397
if(!(yy_init))
Definition: ilang_lexer.cc:846
#define DEF_METHOD_4(_func, _type, _P1, _P2, _P3, _P4)
#define DEF_METHOD_2(_func, _type, _P1, _P2)
#define NEW_ID
Definition: yosys.h:166
RTLIL::Cell * cell(RTLIL::IdString id)
Definition: rtlil.h:638
RTLIL::Cell * addPow(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed=false, bool b_signed=false)

+ Here is the call graph for this function:

static bool fixup_ports_compare ( const RTLIL::Wire a,
const RTLIL::Wire b 
)
static

Definition at line 1266 of file rtlil.cc.

1267 {
1268  if (a->port_id && !b->port_id)
1269  return true;
1270  if (!a->port_id && b->port_id)
1271  return false;
1272 
1273  if (a->port_id == b->port_id)
1274  return a->name < b->name;
1275  return a->port_id < b->port_id;
1276 }
int port_id
Definition: rtlil.h:826
RTLIL::IdString name
Definition: rtlil.h:825

+ Here is the caller graph for this function:

static int sigspec_parse_get_dummy_line_num ( )
static

Definition at line 2967 of file rtlil.cc.

2968 {
2969  return 0;
2970 }

+ Here is the caller graph for this function:

static void sigspec_parse_split ( std::vector< std::string > &  tokens,
const std::string &  text,
char  sep 
)
static

Definition at line 2957 of file rtlil.cc.

2958 {
2959  size_t start = 0, end = 0;
2960  while ((end = text.find(sep, start)) != std::string::npos) {
2961  tokens.push_back(text.substr(start, end - start));
2962  start = end + 1;
2963  }
2964  tokens.push_back(text.substr(start));
2965 }

+ Here is the caller graph for this function: