OpenASIP 2.2
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Private Attributes | List of all members
ProGe::ProcessorWrapperBlock Class Reference

#include <ProcessorWrapperBlock.hh>

Inheritance diagram for ProGe::ProcessorWrapperBlock:
Inheritance graph
Collaboration diagram for ProGe::ProcessorWrapperBlock:
Collaboration graph

Public Member Functions

 ProcessorWrapperBlock ()=delete
 
 ProcessorWrapperBlock (const ProGeContext &context, const BaseNetlistBlock &processorBlock)
 
virtual ~ProcessorWrapperBlock ()
 
virtual void write (const Path &targetBaseDir, HDL targetLang=VHDL) const override
 
- Public Member Functions inherited from ProGe::BaseNetlistBlock
 BaseNetlistBlock ()
 
 BaseNetlistBlock (BaseNetlistBlock *parent)
 
 BaseNetlistBlock (const std::string &moduleName, const std::string &instanceName, BaseNetlistBlock *parent=nullptr)
 
virtual ~BaseNetlistBlock ()
 
const std::string & instanceName () const
 
void setInstanceName (const std::string &name)
 
const std::string & moduleName () const
 
const std::string name () const
 
virtual size_t subBlockCount () const
 
virtual const BaseNetlistBlock & subBlock (size_t index) const
 
virtual bool hasSubBlock (const std::string &instanceName) const
 
virtual bool isSubBlock (const BaseNetlistBlock &block) const
 
virtual bool hasParameter (const std::string &name) const
 
virtual const Parameter & parameter (const std::string &name) const
 
virtual size_t parameterCount () const
 
virtual const Parameter & parameter (size_t index) const
 
virtual size_t portCount () const
 
virtual const NetlistPort & port (size_t index) const
 
virtual std::vector< const NetlistPort * > portsBy (SignalType type) const
 
virtual const NetlistPort & portBy (SignalType type, size_t index=0) const
 
virtual bool hasPortsBy (SignalType type) const
 
virtual const NetlistPort * port (const std::string &portName, bool partialMatch=true) const
 
virtual size_t portGroupCount () const
 
virtual const NetlistPortGroup & portGroup (size_t index) const
 
virtual std::vector< const NetlistPortGroup * > portGroupsBy (SignalGroupType type) const
 
virtual const Netlist & netlist () const
 
virtual bool hasParentBlock () const
 
virtual const BaseNetlistBlock & parentBlock () const
 
virtual bool isVirtual () const
 
virtual void build () override
 
virtual void connect () override
 
virtual void finalize () override
 
virtual void writeSelf (const Path &targetBaseDir, HDL targetLang=VHDL) const
 
virtual size_t packageCount () const
 
virtual const std::string & package (size_t idx) const
 
PortContainerType & ports ()
 
virtual bool isLeaf () const
 
BaseNetlistBlock * shallowCopy (const std::string &instanceName="") const
 
- Public Member Functions inherited from ProGe::IGenerationPhases
virtual ~IGenerationPhases ()
 

Private Member Functions

void addInstructionMemory (const NetlistPortGroup &)
 
void addDataMemory (const MemoryBusInterface &)
 
void addDataMemory2 (const MemoryBusInterface &)
 
void connectLockStatus (const NetlistPort &topPCInitPort)
 
void connectPCInit (const NetlistPort &topPCInitPort)
 
void handleUnconnectedPorts ()
 

Private Attributes

const ProGeContext & context_
 
BaseNetlistBlock * coreBlock_
 The target TTA processor.
 
unsigned imemCount_ = 0
 

Additional Inherited Members

- Public Types inherited from ProGe::BaseNetlistBlock
typedef std::vector< BaseNetlistBlock * > BlockContainerType
 
typedef std::vector< Parameter > ParameterContainerType
 
typedef std::vector< NetlistPort * > PortContainerType
 
typedef std::vector< NetlistPortGroup * > PortGroupContainerType
 
- Protected Member Functions inherited from ProGe::BaseNetlistBlock
Netlist & netlist ()
 
virtual NetlistPort & port (size_t index)
 
virtual BaseNetlistBlock & subBlock (size_t index)
 
virtual BaseNetlistBlock & parentBlock ()
 
void setModuleName (const std::string &name)
 
void addSubBlock (BaseNetlistBlock *subBlock, const std::string &instanceName="")
 
void deleteSubBlock (BaseNetlistBlock *subBlock)
 
void removeSubBlock (BaseNetlistBlock *subBlock)
 
NetlistPort * addPort (NetlistPort *port)
 
void removePort (NetlistPort *port)
 
void addPortGroup (NetlistPortGroup *portGroup)
 
void removePortGroup (NetlistPortGroup *portGroup)
 
void setParameter (const Parameter &param)
 
void addParameter (const Parameter &param)
 
Parameter & parameter (const std::string &name)
 
NetlistPort * findPort (const std::string &portName, bool recursiveSearch=false, bool partialMatch=true) const
 
void addPackage (const std::string &packageName)
 
void connectClocks ()
 
void connectResets ()
 

Detailed Description

Definition at line 51 of file ProcessorWrapperBlock.hh.

Constructor & Destructor Documentation

◆ ProcessorWrapperBlock() [1/2]

ProGe::ProcessorWrapperBlock::ProcessorWrapperBlock ( )
delete

References write().

Here is the call graph for this function:

◆ ProcessorWrapperBlock() [2/2]

ProGe::ProcessorWrapperBlock::ProcessorWrapperBlock ( const ProGeContext &  context,
const BaseNetlistBlock &  processorBlock 
)

Definition at line 53 of file ProcessorWrapperBlock.cc.

55 : BaseNetlistBlock("proc", ""),
56 context_(context),
57 coreBlock_(processorBlock.shallowCopy()) {
58 assert(processorBlock.portCount() > 0);
60
61 // Wrapper interface //
64 NetlistPort* coreLocked = new OutPort("locked", "1");
65 addPort(coreLocked);
66
67 // Instantiate core //
69
70 // Memory instantiations and connections //
71 for (size_t i = 0; i < coreBlock_->portGroupCount(); i++) {
72 const NetlistPortGroup& portGrp = coreBlock_->portGroup(i);
73 SignalGroupType type = portGrp.assignedSignalGroup().type();
75 addInstructionMemory(portGrp);
76 } else if (type == SignalGroupType::BITMASKED_SRAM_PORT) {
77 auto dmemIf = dynamic_cast<const MemoryBusInterface*>(&portGrp);
78 assert(dmemIf != nullptr);
79 addDataMemory(*dmemIf);
80 } else if (type == SignalGroupType::BYTEMASKED_SRAM_PORT) {
81 auto dmemIf = dynamic_cast<const MemoryBusInterface*>(&portGrp);
82 assert(dmemIf != nullptr);
83 addDataMemory2(*dmemIf);
84 }
85 }
86
89 connectLockStatus(*coreLocked);
90
91 // Package holding instruction bus constants
92 std::set<std::string> procPackages{context.globalPackage().name()};
93
94 // Other packages possibly holding constants used in core ports.
95 for (size_t i = 0; i < processorBlock.packageCount(); i++) {
96 procPackages.insert(processorBlock.package(i));
97 }
98
99 for (auto packageStr : procPackages) {
100 addPackage(packageStr);
101 }
102
103 addPackage(context.coreEntityName() + "_params");
104
105 // Handle unknown ports
107}
#define assert(condition)
void addSubBlock(BaseNetlistBlock *subBlock, const std::string &instanceName="")
NetlistPort * addPort(NetlistPort *port)
virtual size_t portGroupCount() const
virtual const NetlistPortGroup & portGroup(size_t index) const
virtual size_t portCount() const
void addPackage(const std::string &packageName)
SignalGroup assignedSignalGroup() const
static NetlistPort * resetPort(Direction direction=IN)
static NetlistPort * clockPort(Direction direction=IN)
BaseNetlistBlock * coreBlock_
The target TTA processor.
void addInstructionMemory(const NetlistPortGroup &)
void addDataMemory2(const MemoryBusInterface &)
void addDataMemory(const MemoryBusInterface &)
void connectLockStatus(const NetlistPort &topPCInitPort)
SignalGroupType type() const
@ BYTEMASKED_SRAM_PORT
Signal group type for one port SRAM having read and write capability and bitmask for writing with sep...
@ BITMASKED_SRAM_PORT
Signal group type for one port SRAM having read and write capability and bitmask for writing.
@ INSTRUCTION_LINE
Signal group type for serial TTA instruction bus.

References addDataMemory(), addDataMemory2(), addInstructionMemory(), ProGe::BaseNetlistBlock::addPackage(), ProGe::BaseNetlistBlock::addPort(), ProGe::BaseNetlistBlock::addSubBlock(), assert, ProGe::NetlistPortGroup::assignedSignalGroup(), ProGe::BITMASKED_SRAM_PORT, ProGe::BYTEMASKED_SRAM_PORT, ProGe::PortFactory::clockPort(), ProGe::BaseNetlistBlock::connectClocks(), connectLockStatus(), ProGe::BaseNetlistBlock::connectResets(), coreBlock_, ProGe::ProGeContext::coreEntityName(), ProGe::ProGeContext::globalPackage(), handleUnconnectedPorts(), ProGe::INSTRUCTION_LINE, ProGe::GlobalPackage::name(), ProGe::BaseNetlistBlock::package(), ProGe::BaseNetlistBlock::packageCount(), ProGe::BaseNetlistBlock::portCount(), ProGe::BaseNetlistBlock::portGroup(), ProGe::BaseNetlistBlock::portGroupCount(), ProGe::PortFactory::resetPort(), and ProGe::SignalGroup::type().

Here is the call graph for this function:

◆ ~ProcessorWrapperBlock()

ProGe::ProcessorWrapperBlock::~ProcessorWrapperBlock ( )
virtual

Definition at line 109 of file ProcessorWrapperBlock.cc.

109{}

Member Function Documentation

◆ addDataMemory()

void ProGe::ProcessorWrapperBlock::addDataMemory ( const MemoryBusInterface &  coreDmemPort)
private

Definition at line 179 of file ProcessorWrapperBlock.cc.

179 {
180 using SigT = SignalType;
181
182 const NetlistPort& addrPort = coreDmemPort.portBySignal(SigT::ADDRESS);
183 const NetlistPort& dataPort = coreDmemPort.portBySignal(SigT::WRITE_DATA);
184
185 SinglePortSSRAMBlock* dmemBlock = new SinglePortSSRAMBlock(
186 addrPort.widthFormula(), dataPort.widthFormula(),
187 TCEString("tb/dmem_") + coreDmemPort.addressSpace() + "_init.img",
188 /* isForSmulation = */ true);
189 addSubBlock(dmemBlock, TCEString("dmem_") + coreDmemPort.addressSpace());
190
191 if (!netlist().connect(dmemBlock->memoryPort(), coreDmemPort)) {
194 "Could not connect two port groups together.");
195 }
196}
#define THROW_EXCEPTION(exceptionType, message)
Exception wrapper macro that automatically includes file name, line number and function name where th...
Definition Exception.hh:39
virtual void connect() override
virtual const Netlist & netlist() const

References ProGe::MemoryBusInterface::addressSpace(), ProGe::SinglePortSSRAMBlock::memoryPort(), ProGe::NetlistPortGroup::portBySignal(), THROW_EXCEPTION, and ProGe::NetlistPort::widthFormula().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ addDataMemory2()

void ProGe::ProcessorWrapperBlock::addDataMemory2 ( const MemoryBusInterface &  coreDmemPort)
private

Definition at line 199 of file ProcessorWrapperBlock.cc.

200 {
201 using SigT = SignalType;
202
203 const NetlistPort& addrPort = coreDmemPort.portBySignal(SigT::AADDR);
204 const NetlistPort& dataPort = coreDmemPort.portBySignal(SigT::RDATA);
205
206 SinglePortByteMaskSSRAMBlock* dmemBlock =
207 new SinglePortByteMaskSSRAMBlock(
208 addrPort.widthFormula(), dataPort.widthFormula(),
209 TCEString("tb/dmem_") + coreDmemPort.addressSpace() + "_init.img",
210 /* isForSmulation = */ true);
211 addSubBlock(dmemBlock, TCEString("dmem_") + coreDmemPort.addressSpace());
212
213 if (!netlist().connect(dmemBlock->memoryPort(), coreDmemPort)) {
216 "Could not connect two port groups together.");
217 }
218}

References ProGe::MemoryBusInterface::addressSpace(), ProGe::SinglePortByteMaskSSRAMBlock::memoryPort(), ProGe::NetlistPortGroup::portBySignal(), THROW_EXCEPTION, and ProGe::NetlistPort::widthFormula().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ addInstructionMemory()

void ProGe::ProcessorWrapperBlock::addInstructionMemory ( const NetlistPortGroup &  coreImemPort)
private

Definition at line 120 of file ProcessorWrapperBlock.cc.

121 {
122 using SigT = SignalType;
123 bool isRISCV = context_.adf().isRISCVMachine();
124
125 const int imemWidthInMaus = (context_.adf().isRISCVMachine()) ? 4 : 1;
126 const int unusedBits = std::ceil(std::log2(imemWidthInMaus));
127
128 std::string addrWidth = context_.globalPackage().fetchBlockAddressWidth();
129 if (isRISCV) {
130 const int unusedBits = std::ceil(std::log2(imemWidthInMaus));
131 addrWidth = context_.globalPackage().fetchBlockAddressWidth() + "-" +
132 std::to_string(unusedBits);
133 }
134
135 SinglePortSSRAMBlock* imemBlock = new SinglePortSSRAMBlock(
137 "tb/imem_init.img", true);
138 addSubBlock(imemBlock, "imem0");
139 // todo: use core id instead of counter value.
140 std::string accessTrace = std::string("core") +
142 "_imem_access_trace.dump";
143 imemBlock->setAccessTraceFile(accessTrace);
144
145 if (isRISCV) {
146 // With RISC-V the two lower bits are unused
147 const int realAddrWidth = MathTools::requiredBits(
150 imemBlock->memoryPort(), coreImemPort,
151 {{SigT::READ_DATA, SigT::FETCHBLOCK},
152 {SigT::READ_WRITE_REQUEST, SigT::READ_REQUEST}});
154 imemBlock->memoryPort().portBySignal(SigT::ADDRESS),
155 coreImemPort.portBySignal(SigT::ADDRESS), 0, unusedBits,
156 realAddrWidth - unusedBits);
157 } else {
159 imemBlock->memoryPort(), coreImemPort,
160 {{SigT::ADDRESS, SigT::ADDRESS},
161 {SigT::READ_DATA, SigT::FETCHBLOCK},
162 {SigT::READ_WRITE_REQUEST, SigT::READ_REQUEST}});
163 }
164
165 imemBlock->memoryPort()
166 .portBySignal(SigT::WRITE_BITMASK)
167 .setToStatic(StaticSignal::VCC);
168 imemBlock->memoryPort()
169 .portBySignal(SigT::WRITEMODE)
170 .setToStatic(StaticSignal::VCC);
171 imemBlock->memoryPort()
172 .portBySignal(SigT::WRITE_DATA)
173 .setToStatic(StaticSignal::GND);
174 coreImemPort.portBySignal(SigT::READ_REQUEST_READY)
175 .setToStatic(StaticSignal::GND); // Active low
176}
static std::string toString(const T &source)
static int requiredBits(unsigned long int number)
const std::string fetchBlockAddressWidth() const
const std::string fetchBlockDataWidth() const
bool connect(const NetlistPort &port1, const NetlistPort &port2, int port1FirstBit, int port2FirstBit, int width=1)
Definition Netlist.cc:83
const TTAMachine::Machine & adf() const
const GlobalPackage & globalPackage() const
@ GND
All port signals set to low.
@ VCC
All port signals set to high.
virtual ULongWord end() const
virtual AddressSpace * addressSpace() const
virtual ControlUnit * controlUnit() const
Definition Machine.cc:345
bool isRISCVMachine() const
Definition Machine.cc:1057

References TTAMachine::FunctionUnit::addressSpace(), ProGe::BaseNetlistBlock::addSubBlock(), ProGe::ProGeContext::adf(), ProGe::Netlist::connect(), context_, TTAMachine::Machine::controlUnit(), TTAMachine::AddressSpace::end(), ProGe::GlobalPackage::fetchBlockAddressWidth(), ProGe::GlobalPackage::fetchBlockDataWidth(), ProGe::ProGeContext::globalPackage(), imemCount_, TTAMachine::Machine::isRISCVMachine(), ProGe::SinglePortSSRAMBlock::memoryPort(), ProGe::BaseNetlistBlock::netlist(), ProGe::NetlistPortGroup::portBySignal(), MathTools::requiredBits(), ProGe::SinglePortSSRAMBlock::setAccessTraceFile(), and Conversion::toString().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ connectLockStatus()

void ProGe::ProcessorWrapperBlock::connectLockStatus ( const NetlistPort &  topPCInitPort)
private

Definition at line 221 of file ProcessorWrapperBlock.cc.

222 {
223 assert(
224 coreBlock_->port("locked") != nullptr &&
225 "Could not found lock status port.");
226 if (!netlist().connect(*coreBlock_->port("locked"), topLockStatusPort)) {
229 "Could not connect \"locked\" signal to the toplevel");
230 }
231}
virtual const NetlistPort & port(size_t index) const

References assert, and THROW_EXCEPTION.

Referenced by ProcessorWrapperBlock().

◆ connectPCInit()

void ProGe::ProcessorWrapperBlock::connectPCInit ( const NetlistPort &  topPCInitPort)
private

◆ handleUnconnectedPorts()

void ProGe::ProcessorWrapperBlock::handleUnconnectedPorts ( )
private

Handles unconnected ports of the top-level TTA processor by connecting them to the toplevel

Definition at line 238 of file ProcessorWrapperBlock.cc.

238 {
239 for (size_t i = 0; i < coreBlock_->portCount(); i++) {
240 const NetlistPort& port =
241 ((const BaseNetlistBlock*)coreBlock_)->port(i);
243 NetlistPort* topPort = port.clone();
244 addPort(topPort);
245 netlist().connect(*topPort, port);
246 }
247 }
248}
virtual NetlistPort * clone(bool asMirrored=false) const
bool hasStaticValue() const
bool isPortConnected(const NetlistPort &port) const
Definition Netlist.cc:273

References ProGe::NetlistPort::clone(), and ProGe::NetlistPort::hasStaticValue().

Referenced by ProcessorWrapperBlock().

Here is the call graph for this function:

◆ write()

void ProGe::ProcessorWrapperBlock::write ( const Path &  targetBaseDir,
HDL  targetLang = VHDL 
) const
overridevirtual

Does nothing on self but calls write function on each sub block.

Reimplemented from ProGe::BaseNetlistBlock.

Definition at line 112 of file ProcessorWrapperBlock.cc.

113 {
115 targetBaseDir / std::string("tb"), targetLang);
116 BaseNetlistBlock::write(targetBaseDir, targetLang);
117}
virtual void write(const Path &targetBaseDir, HDL targetLang=VHDL) const override
virtual void writeSelf(const Path &targetBaseDir, HDL targetLang=VHDL) const

References ProGe::BaseNetlistBlock::write(), and ProGe::BaseNetlistBlock::writeSelf().

Referenced by ProcessorWrapperBlock(), and ProGe::TestBenchBlock::write().

Here is the call graph for this function:

Member Data Documentation

◆ context_

const ProGeContext& ProGe::ProcessorWrapperBlock::context_
private

Definition at line 74 of file ProcessorWrapperBlock.hh.

Referenced by addInstructionMemory().

◆ coreBlock_

BaseNetlistBlock* ProGe::ProcessorWrapperBlock::coreBlock_
private

The target TTA processor.

Definition at line 76 of file ProcessorWrapperBlock.hh.

Referenced by ProcessorWrapperBlock().

◆ imemCount_

unsigned ProGe::ProcessorWrapperBlock::imemCount_ = 0
private

Definition at line 77 of file ProcessorWrapperBlock.hh.

Referenced by addInstructionMemory().


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