30 #ifndef scClusterBusMemorySlow_h
31 #define scClusterBusMemorySlow_h
39 #include "scClusterBusMaster_blocking.h"
44 sc_core::sc_time ReplyTime;
46 } scMemoryMessageFIFO_t;
48 class scMemoryMessagefifowrite_if :
virtual public sc_interface
51 virtual void write(scMemoryMessageFIFO_t*) = 0;
52 virtual void reset() = 0;
55 class scMemoryMessagefiforead_if :
virtual public sc_interface
58 virtual void read(scMemoryMessageFIFO_t*&) = 0;
59 virtual int num_available() = 0;
63 typedef struct {
unsigned int Address;
int Lineno; std::string Line;} AddressToLineRecord;
73 class scMemoryMessageFIFO :
public sc_channel,
public scMemoryMessagefifowrite_if,
public scMemoryMessagefiforead_if
80 void write(scMemoryMessageFIFO_t* c) {
81 if (num_elements == max)
82 wait(scMemoryMessageFIFO_read_event);
84 data[(first + num_elements) % max] = c;
90 void read(scMemoryMessageFIFO_t* &c){
91 if (num_elements == 0)
92 wait(scMemoryMessageFIFO_write_event);
96 first = (first + 1) % max;
101 void reset() { num_elements = first = 0; }
103 int num_available() {
return num_elements;}
107 scMemoryMessageFIFO_t* data[max];
108 uint16_t num_elements, first;
109 sc_event scMemoryMessageFIFO_write_event, scMemoryMessageFIFO_read_event;
126 :
public scClusterBusSlave_if
143 ,
unsigned int start_address
144 ,
unsigned int end_address
145 ,
unsigned int nr_wait_states);
169 void ProcessFIFOMessages(
void);
173 bool direct_read(
int *data,
unsigned int address);
174 bool direct_write(
int *data,
unsigned int address);
179 ClusterBusStatus read(
int *data,
unsigned int address);
180 ClusterBusStatus write(
int *data,
unsigned int address);
181 ClusterBusStatus read(
scIGPMessage*){
return CLUSTER_BUS_ERROR;}
184 CreateReadMessageReply(scMemoryMessageFIFO_t* M);
186 CreateWriteMessage(
scGridPoint* From,
unsigned int Address,
int Length);
188 StringOfClusterAddress_Get(
void);
191 ReadFIFO(scMemoryMessageFIFO_t *&M){
return MemoryMessagefifo->
read(M);}
193 WriteFIFO(scMemoryMessageFIFO_t *&M){
return MemoryMessagefifo->
write(M);}
199 PrologText_Get(
void);
207 start_address()
const;
211 Size_Get(
void){
return m_size;}
215 Byte_Get(uint32_t Address){
return mem[Address];}
217 Byte_Set(uint32_t Address, uint8_t B){ mem[Address] = B;}
219 DWord_Get(uint32_t Address);
221 DWord_Set(uint32_t Address, uint32_t C);
223 findLinenoToAddress(SC_ADDRESS_TYPE A);
225 findAddressToLineno(int32_t L);
227 getSourceLine(
int L);
229 StartAddress_Get(
void){
return m_start_address; }
231 QueueLength_Get(
void){
return MemoryMessagefifo->num_available(); }
237 unsigned int m_start_address;
238 unsigned int m_end_address;
239 unsigned int m_nr_wait_states;
256 vector <AddressToLineRecord*>
262 inline scClusterBusMemorySlow::~scClusterBusMemorySlow()
264 if (MEM)
delete [] MEM;
268 inline void scClusterBusMemorySlow::wait_loop()
270 if (m_wait_count >= 0) m_wait_count--;
273 inline bool scClusterBusMemorySlow::direct_read(
int *data,
unsigned int address)
275 assert((address - m_start_address)/4 < m_size);
276 *data = MEM[(address - m_start_address)/4];
280 inline bool scClusterBusMemorySlow::direct_write(
int *data,
unsigned int address)
282 assert((address - m_start_address)/4 < m_size);
283 MEM[(address - m_start_address)/4] = *data;
287 inline ClusterBusStatus scClusterBusMemorySlow::read(
int *data
288 ,
unsigned int address)
290 assert((address - m_start_address)/4 < m_size);
292 if (m_wait_count < 0)
294 m_wait_count = m_nr_wait_states;
295 return CLUSTER_BUS_WAIT;
297 if (m_wait_count == 0)
299 *data = MEM[(address - m_start_address)/4];
300 return CLUSTER_BUS_OK;
302 return CLUSTER_BUS_WAIT;
305 inline ClusterBusStatus scClusterBusMemorySlow::write(
int *data
306 ,
unsigned int address)
308 assert((address - m_start_address)/4 < m_size);
310 if (m_wait_count < 0)
312 m_wait_count = m_nr_wait_states;
313 return CLUSTER_BUS_WAIT;
315 if (m_wait_count == 0)
317 MEM[(address - m_start_address)/4] = *data;
318 return CLUSTER_BUS_OK;
320 return CLUSTER_BUS_WAIT;
323 inline unsigned int scClusterBusMemorySlow::start_address()
const
325 return m_start_address;
328 inline unsigned int scClusterBusMemorySlow::
331 return m_end_address;
334 #endif // scClusterBusMemorySlow_h