OpenASIP 2.2
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Protected Attributes | Static Private Attributes | List of all members
XilinxBlockRamGenerator Class Reference

#include <XilinxBlockRamGenerator.hh>

Inheritance diagram for XilinxBlockRamGenerator:
Inheritance graph
Collaboration diagram for XilinxBlockRamGenerator:
Collaboration graph

Public Member Functions

 XilinxBlockRamGenerator (int memMauWidth, int widthInMaus, int addrWidth, int portBDataWidth, int portBAddrWidth, const PlatformIntegrator *integrator, std::ostream &warningStream, std::ostream &errorStream, bool connectToArbiter=false, ProGe::NetlistBlock *almaifBlocks=nullptr, TCEString signalPrefix="", bool overrideAddrWidth=false, bool singleMemoryBlock=false)
 
virtual ~XilinxBlockRamGenerator ()
 
virtual bool generatesComponentHdlFile () const
 
virtual std::vector< TCEStringgenerateComponentFile (TCEString outputPath)
 
virtual void addMemory (const ProGe::NetlistBlock &ttaCore, ProGe::NetlistBlock &integratorBlock, int memIndex, int coreId)
 
virtual bool isCompatible (const ProGe::NetlistBlock &ttaCore, int coreId, std::vector< TCEString > &reasons) const
 
- Public Member Functions inherited from MemoryGenerator
 MemoryGenerator (int memMauWidth, int widthInMaus, int addrWidth, TCEString initFile, const PlatformIntegrator *integrator, std::ostream &warningStream, std::ostream &errorStream)
 
virtual ~MemoryGenerator ()
 
int memoryTotalWidth () const
 
int memoryMauSize () const
 
int memoryWidthInMaus () const
 
int memoryAddrWidth () const
 
TCEString initializationFile () const
 
void addLsu (TTAMachine::FunctionUnit &lsuArch, std::vector< std::string > lsuPorts)
 

Protected Member Functions

virtual TCEString moduleName () const
 
void addPorts (std::string prefix, int addrWidth, int dataWidth)
 
virtual TCEString instanceName (int coreId, int) const
 
TCEString almaifPortName (const TCEString &portBaseName)
 
- Protected Member Functions inherited from MemoryGenerator
virtual bool checkFuPort (const std::string fuPort, std::vector< TCEString > &reasons) const
 
virtual void connectPorts (ProGe::NetlistBlock &netlistBlock, const ProGe::NetlistPort &memPort, const ProGe::NetlistPort &corePort, bool inverted, int coreId)
 
virtual MemoryGenerator::BlockPair createMemoryNetlistBlock (ProGe::NetlistBlock &integratorBlock, int memIndex, int coreId)
 
const PlatformIntegratorplatformIntegrator () const
 
std::ostream & warningStream ()
 
std::ostream & errorStream ()
 
int portCount () const
 
const HDLPortport (int index) const
 
const HDLPortportByKeyName (TCEString name) const
 
TCEString portKeyName (const HDLPort *port) const
 
void addPort (const TCEString &name, HDLPort *port)
 
int parameterCount () const
 
const ProGe::Parameterparameter (int index) const
 
void addParameter (const ProGe::Parameter &add)
 
TCEString ttaCoreName () const
 
TCEString memoryIndexString (int coreId, int memIndex) const
 
TCEString templatePath () const
 
void instantiateTemplate (const TCEString &inFile, const TCEString &outFile, const TCEString &entity) const
 
bool hasLSUArchitecture () const
 
const TTAMachine::FunctionUnitlsuArchitecture () const
 
TCEString corePortName (const TCEString &portBaseName, int coreId) const
 

Protected Attributes

const bool connectToArbiter_
 
ProGe::NetlistBlockalmaifBlock_
 
TCEString signalPrefix_
 
const bool overrideAddrWidth_
 
const bool singleMemoryBlock_
 

Static Private Attributes

static const TCEString DP_FILE = "xilinx_dp_blockram.vhdl"
 
static const TCEString SP_FILE = "xilinx_blockram.vhdl"
 

Additional Inherited Members

- Protected Types inherited from MemoryGenerator
typedef std::multimap< TCEString, HDLPort * > PortMap
 
typedef std::pair< ProGe::NetlistBlock *, ProGe::VirtualNetlistBlock * > BlockPair
 

Detailed Description

Definition at line 41 of file XilinxBlockRamGenerator.hh.

Constructor & Destructor Documentation

◆ XilinxBlockRamGenerator()

XilinxBlockRamGenerator::XilinxBlockRamGenerator ( int  memMauWidth,
int  widthInMaus,
int  addrWidth,
int  portBDataWidth,
int  portBAddrWidth,
const PlatformIntegrator integrator,
std::ostream &  warningStream,
std::ostream &  errorStream,
bool  connectToArbiter = false,
ProGe::NetlistBlock almaifBlocks = nullptr,
TCEString  signalPrefix = "",
bool  overrideAddrWidth = false,
bool  singleMemoryBlock = false 
)

Definition at line 47 of file XilinxBlockRamGenerator.cc.

54 memMauWidth, widthInMaus, addrWidth, "", integrator, warningStream,
56 connectToArbiter_(connectToArbiter),
57 almaifBlock_(almaifBlock),
58 signalPrefix_(signalPrefix),
59 overrideAddrWidth_(overrideAddrWidth),
60 singleMemoryBlock_(singleMemoryBlock) {
61 assert (!connectToArbiter || almaifBlock != nullptr);
62
63 ProGe::Parameter dataw = {"dataw_g", "integer",
65 ProGe::Parameter addrw = {"addrw_g", "integer",
67
68
69 ProGe::Parameter second_dataw = {"dataw_b_g", "integer",
70 Conversion::toString(portBDataWidth)};
71 ProGe::Parameter second_addrw = {"addrw_b_g", "integer",
72 Conversion::toString(portBAddrWidth)};
73
74 if (overrideAddrWidth) {
75 addrw.setValue("local_mem_addrw_g");
76 second_addrw.setValue("local_mem_addrw_g");
77 }
78
79 addParameter(dataw);
80 addParameter(addrw);
81
83 addParameter(second_dataw);
84 addParameter(second_addrw);
85 }
86
87 addPort("clk", new HDLPort("clk", "1", ProGe::BIT, ProGe::IN, false, 1));
88 addPort("rstx", new HDLPort("rstx", "1", ProGe::BIT, ProGe::IN, false, 1));
89 if (connectToArbiter) {
91 addPorts("b_", portBAddrWidth, portBDataWidth);
92 } else {
94 }
95}
#define assert(condition)
static std::string toString(const T &source)
std::ostream & warningStream()
void addParameter(const ProGe::Parameter &add)
void addPort(const TCEString &name, HDLPort *port)
int memoryTotalWidth() const
std::ostream & errorStream()
int memoryAddrWidth() const
void setValue(const TCEString &value)
Definition Parameter.cc:128
ProGe::NetlistBlock * almaifBlock_
void addPorts(std::string prefix, int addrWidth, int dataWidth)
@ BIT
One bit.
Definition ProGeTypes.hh:47
@ IN
Input port.
Definition ProGeTypes.hh:53

References MemoryGenerator::addParameter(), MemoryGenerator::addPort(), addPorts(), assert, ProGe::BIT, connectToArbiter_, ProGe::IN, MemoryGenerator::memoryAddrWidth(), MemoryGenerator::memoryTotalWidth(), ProGe::Parameter::setValue(), and Conversion::toString().

Here is the call graph for this function:

◆ ~XilinxBlockRamGenerator()

XilinxBlockRamGenerator::~XilinxBlockRamGenerator ( )
virtual

Definition at line 97 of file XilinxBlockRamGenerator.cc.

97 {
98}

Member Function Documentation

◆ addMemory()

void XilinxBlockRamGenerator::addMemory ( const ProGe::NetlistBlock ttaCore,
ProGe::NetlistBlock integratorBlock,
int  memIndex,
int  coreId 
)
virtual

Reimplemented from MemoryGenerator.

Definition at line 149 of file XilinxBlockRamGenerator.cc.

152 {
153
154 // Do not instantiate multiple physical memories for shared AS when shared
155 if (coreId > 0 && connectToArbiter_ && singleMemoryBlock_) {
156 return;
157 }
158 BlockPair blocks =
159 createMemoryNetlistBlock(integratorBlock, memIndex, coreId);
160 ProGe::NetlistBlock* mem = blocks.first;
161 ProGe::VirtualNetlistBlock* virt = blocks.second;
162 assert(mem != NULL);
163 assert(virt != NULL);
164
165 if (virt->portCount() > 0) {
166 integratorBlock.addSubBlock(virt);
167 }
168
169 for (int i = 0; i < portCount(); i++) {
170 const HDLPort* hdlPort = port(i);
171 ProGe::NetlistPort* memPort = mem->port(hdlPort->name());
172 if (memPort == NULL) {
173 memPort = virt->port(hdlPort->name());
174 if (memPort == NULL) {
175 TCEString msg = "Port ";
176 msg << hdlPort->name() << " not found from netlist block";
177 throw InvalidData(__FILE__, __LINE__, "MemoryGenerator", msg);
178 }
179 }
180
181
182 TCEString portName = corePortName(portKeyName(hdlPort), coreId);
183 const ProGe::NetlistPort* corePort = NULL;
184 // clock and reset must be connected to new toplevel ports
185 if (portName == platformIntegrator()->clockPort()->name()) {
186 corePort = platformIntegrator()->clockPort();
187 } else if (portName == platformIntegrator()->resetPort()->name()) {
188 corePort = platformIntegrator()->resetPort();
189 } else {
190 if (connectToArbiter_) {
191 portName = almaifPortName(portKeyName(hdlPort));
192 corePort = almaifBlock_->port(portName);
193 } else {
194 corePort = ttaCore.port(portName);
195 }
196 }
197 if (corePort == NULL) {
198 TCEString msg = "Port ";
199 msg << portName << " not found from";
200 if (connectToArbiter_) {
201 msg << " AlmaIF ";
202 } else {
203 msg << " TTA core ";
204 }
205 msg << "netlist block";
206 throw InvalidData(__FILE__, __LINE__, "MemoryGenerator", msg);
207 }
208
210 corePort->realWidth() != memPort->realWidth()) {
211 // Assume a private memory, split wide integrator signals accross
212 // multiple cores
213 int portWidth = memPort->realWidth();
214 // This assumes no ports are inverted
215 integratorBlock.netlist().connect(*memPort, *corePort,
216 0, portWidth*coreId,
217 portWidth);
218 } else {
220 integratorBlock, *corePort, *memPort,
221 hdlPort->needsInversion(), coreId);
222 }
223 }
224}
TCEString name() const
Definition HDLPort.cc:87
bool needsInversion() const
Definition HDLPort.cc:122
TCEString portKeyName(const HDLPort *port) const
const PlatformIntegrator * platformIntegrator() const
const HDLPort * port(int index) const
std::pair< ProGe::NetlistBlock *, ProGe::VirtualNetlistBlock * > BlockPair
virtual void connectPorts(ProGe::NetlistBlock &netlistBlock, const ProGe::NetlistPort &memPort, const ProGe::NetlistPort &corePort, bool inverted, int coreId)
TCEString corePortName(const TCEString &portBaseName, int coreId) const
int portCount() const
virtual MemoryGenerator::BlockPair createMemoryNetlistBlock(ProGe::NetlistBlock &integratorBlock, int memIndex, int coreId)
ProGe::NetlistPort * resetPort() const
ProGe::NetlistPort * clockPort() const
void addSubBlock(BaseNetlistBlock *subBlock, const std::string &instanceName="")
virtual NetlistPort * port(const std::string &portName, bool partialMatch=true)
virtual size_t portCount() const
virtual const Netlist & netlist() const
int realWidth() const
bool connect(const NetlistPort &port1, const NetlistPort &port2, int port1FirstBit, int port2FirstBit, int width=1)
Definition Netlist.cc:83
TCEString almaifPortName(const TCEString &portBaseName)

References ProGe::NetlistBlock::addSubBlock(), almaifBlock_, almaifPortName(), assert, PlatformIntegrator::clockPort(), ProGe::Netlist::connect(), MemoryGenerator::connectPorts(), connectToArbiter_, MemoryGenerator::corePortName(), MemoryGenerator::createMemoryNetlistBlock(), HDLPort::name(), HDLPort::needsInversion(), ProGe::NetlistBlock::netlist(), overrideAddrWidth_, MemoryGenerator::platformIntegrator(), ProGe::NetlistBlock::port(), MemoryGenerator::port(), MemoryGenerator::portCount(), ProGe::NetlistBlock::portCount(), MemoryGenerator::portKeyName(), ProGe::NetlistPort::realWidth(), PlatformIntegrator::resetPort(), and singleMemoryBlock_.

Here is the call graph for this function:

◆ addPorts()

void XilinxBlockRamGenerator::addPorts ( std::string  prefix,
int  addrWidth,
int  dataWidth 
)
protected

Definition at line 106 of file XilinxBlockRamGenerator.cc.

107 {
108 std::string datawGeneric = "dataw_g";
109 std::string addrwGeneric = "addrw_g";
110 if (pfx == "b_") {
111 datawGeneric = "dataw_b_g";
112 addrwGeneric = "addrw_b_g";
113 }
118 const bool noInvert = false;
119 addPort(pfx + "avalid_out",
120 new HDLPort(pfx + "avalid_in", "1", BIT, IN, noInvert, 1));
121 addPort(pfx + "aready_in",
122 new HDLPort(pfx + "aready_out", "1", BIT, OUT, noInvert, 1));
123 if (!overrideAddrWidth_) {
124 addPort(pfx + "aaddr_out",
125 new HDLPort(pfx + "aaddr_in", addrwGeneric, VEC, IN, noInvert,
126 addrWidth));
127 } else {
128 addPort(pfx + "aaddr_out",
129 new HDLPort(pfx + "aaddr_in", addrwGeneric, VEC, IN, noInvert));
130 }
131 addPort(pfx + "awren_out",
132 new HDLPort(pfx + "awren_in", "1", BIT, IN, noInvert, 1));
133 addPort(pfx + "astrb_out",
134 new HDLPort(pfx + "astrb_in", "(" + datawGeneric + "+7)/8", VEC, IN,
135 noInvert, (dataWidth+7)/8));
136 addPort(pfx + "adata_out",
137 new HDLPort(pfx + "adata_in", datawGeneric, VEC, IN, noInvert,
138 dataWidth));
139 addPort(pfx + "rvalid_in",
140 new HDLPort(pfx + "rvalid_out", "1", BIT, ProGe::OUT, noInvert, 1));
141 addPort(pfx + "rready_out",
142 new HDLPort(pfx + "rready_in", "1", BIT, IN, noInvert, 1));
143 addPort(pfx + "rdata_in",
144 new HDLPort(pfx + "rdata_out", datawGeneric, VEC, OUT, noInvert,
145 dataWidth));
146}
@ OUT
Output port.
Definition HDBTypes.hh:42
@ IN
Input port.
Definition HDBTypes.hh:41
DataType
Data types of hardware ports.
Definition ProGeTypes.hh:46
@ BIT_VECTOR
Several bits.
Definition ProGeTypes.hh:48
Direction
Direction of the port.
Definition ProGeTypes.hh:52
@ OUT
Output port.
Definition ProGeTypes.hh:54

References MemoryGenerator::addPort(), ProGe::BIT, ProGe::BIT_VECTOR, ProGe::IN, ProGe::OUT, and overrideAddrWidth_.

Referenced by XilinxBlockRamGenerator().

Here is the call graph for this function:

◆ almaifPortName()

TCEString XilinxBlockRamGenerator::almaifPortName ( const TCEString portBaseName)
protected

Definition at line 263 of file XilinxBlockRamGenerator.cc.

263 {
264 // clock and reset port names are global
265 if (portBaseName == platformIntegrator()->clockPort()->name() ||
266 portBaseName == platformIntegrator()->resetPort()->name()) {
267 return portBaseName;
268 }
269
270 return signalPrefix_ + "_" + portBaseName;
271}

References MemoryGenerator::platformIntegrator(), and signalPrefix_.

Referenced by addMemory().

Here is the call graph for this function:

◆ generateComponentFile()

std::vector< TCEString > XilinxBlockRamGenerator::generateComponentFile ( TCEString  outputPath)
virtual

Implements MemoryGenerator.

Definition at line 227 of file XilinxBlockRamGenerator.cc.

227 {
228 TCEString inputFile =
231 TCEString outputFile;
232 outputFile << outputPath << FileSystem::DIRECTORY_SEPARATOR
233 << moduleName() << ".vhdl";
234
235 FileSystem::copy(inputFile, outputPath);
236 std::vector<TCEString> files;
237 files.push_back(outputFile);
238 return files;
239}
static const std::string DIRECTORY_SEPARATOR
static void copy(const std::string &source, const std::string &target)
TCEString templatePath() const
virtual TCEString moduleName() const
static const TCEString DP_FILE
static const TCEString SP_FILE

References connectToArbiter_, FileSystem::copy(), FileSystem::DIRECTORY_SEPARATOR, DP_FILE, moduleName(), SP_FILE, and MemoryGenerator::templatePath().

Here is the call graph for this function:

◆ generatesComponentHdlFile()

bool XilinxBlockRamGenerator::generatesComponentHdlFile ( ) const
virtual

Implements MemoryGenerator.

Definition at line 101 of file XilinxBlockRamGenerator.cc.

101 {
102 return true;
103}

◆ instanceName()

TCEString XilinxBlockRamGenerator::instanceName ( int  coreId,
int   
) const
protectedvirtual

Implements MemoryGenerator.

Definition at line 253 of file XilinxBlockRamGenerator.cc.

253 {
254 TCEString iname = "onchip_mem_";
255
256 if (coreId != -1) {
257 iname << "core" << coreId << "_";
258 }
259 return iname << signalPrefix_;
260}

References signalPrefix_.

◆ isCompatible()

bool XilinxBlockRamGenerator::isCompatible ( const ProGe::NetlistBlock ttaCore,
int  coreId,
std::vector< TCEString > &  reasons 
) const
virtual

Tests that the memory generator is compatible with TTA core. If incompatible, reasons are appended to the reasons vector

Parameters
ttaCoreTTA toplevel
coreIdThe core ID number
reasonsReasons why incompatible
Returns
is memory generator compatible with the TTA core

Reimplemented from MemoryGenerator.

Definition at line 274 of file XilinxBlockRamGenerator.cc.

275 {
276 if (connectToArbiter_) {
277 // TODO: Actually check almaifBlock_ ports?
278 return true;
279 } else {
280 return MemoryGenerator::isCompatible(ttaCore, coreId, reasons);
281 }
282}
virtual bool isCompatible(const ProGe::NetlistBlock &ttaCore, int coreId, std::vector< TCEString > &reasons) const

References connectToArbiter_, and MemoryGenerator::isCompatible().

Here is the call graph for this function:

◆ moduleName()

TCEString XilinxBlockRamGenerator::moduleName ( ) const
protectedvirtual

Implements MemoryGenerator.

Definition at line 243 of file XilinxBlockRamGenerator.cc.

243 {
244 TCEString name = "xilinx_";
246 name += "dp_";
247 name += "blockram";
248 return name;
249}

References connectToArbiter_.

Referenced by generateComponentFile().

Member Data Documentation

◆ almaifBlock_

ProGe::NetlistBlock* XilinxBlockRamGenerator::almaifBlock_
protected

Definition at line 82 of file XilinxBlockRamGenerator.hh.

Referenced by addMemory().

◆ connectToArbiter_

const bool XilinxBlockRamGenerator::connectToArbiter_
protected

◆ DP_FILE

const TCEString XilinxBlockRamGenerator::DP_FILE = "xilinx_dp_blockram.vhdl"
staticprivate

Definition at line 89 of file XilinxBlockRamGenerator.hh.

Referenced by generateComponentFile().

◆ overrideAddrWidth_

const bool XilinxBlockRamGenerator::overrideAddrWidth_
protected

Definition at line 84 of file XilinxBlockRamGenerator.hh.

Referenced by addMemory(), and addPorts().

◆ signalPrefix_

TCEString XilinxBlockRamGenerator::signalPrefix_
protected

Definition at line 83 of file XilinxBlockRamGenerator.hh.

Referenced by almaifPortName(), and instanceName().

◆ singleMemoryBlock_

const bool XilinxBlockRamGenerator::singleMemoryBlock_
protected

Definition at line 85 of file XilinxBlockRamGenerator.hh.

Referenced by addMemory().

◆ SP_FILE

const TCEString XilinxBlockRamGenerator::SP_FILE = "xilinx_blockram.vhdl"
staticprivate

Definition at line 90 of file XilinxBlockRamGenerator.hh.

Referenced by generateComponentFile().


The documentation for this class was generated from the following files: