SRAM.cc
// INCLUDE THE CLASS DECLARATION

#include "SRAM.h"

// INCLUDE CLASSES USED IN THE IMPLEMENTATION

#include "smi_channel.h"
#include "smi_message.h"

//***********************
// CLASS DEFINITION: SRAM
//***********************

// CONSTANTS: MUST MATCH THE DEFINITION USED BY THE VERILOG WRAPPER

const int SRAM::MEM_CONFIG=0;
const int SRAM::MEM_WRITE=1;
const int SRAM::MEM_READ=2;

// CONSTRUCTOR

SRAM::SRAM(const string& name):
    d_name(name)
{
    // FETCH THE SMI CHANNEL POINTER

    SMI_Channel* channel = SMI_Channel::instance();

    // ALLOCATE AN SMI REPLY MESSAGE

    d_tx = channel->newTxMessage();

    // REGISTER THIS MODEL INSTANCE WITH SMI

    channel->add(name, "SRAM", this);
}

// DESTRUCTOR

SRAM::~SRAM()
{
    // DELETE THE SMI REPLY MESSAGE

    delete d_tx;
}

// METHOD: process(rx)

SMI_TxMessage*
SRAM::process(const SMI_RxMessage& rx)
{
    // CHOOSE AN ACTION DEPENDING ON THE MESSAGE TYPE

    switch(rx.integer(0))
    {

    // IF THE MESSAGE TYPE IS "Configure"

    case MEM_CONFIG: 

        // SET THE BIT WIDTH FROM THE "width" MESSAGE VALUE

        d_width = rx.integer(1);
        break;

    // IF THE MESSAGE TYPE IS "Read+Write"

    case MEM_WRITE:

        // READ THE VALUE OF THE MEMORY WORD AT THE ADDRESS GIVEN BY THE
        // "address" MESSAGE VALUE AND STORE IN THE REPLY MESSAGE

        d_tx->append(d_width, d_memory[rx.integer(1)]);

        // READ THE VALUE GIVEN BY THE "data" MESSAGE VALUE TO THE MEMORY WORD
        // AT THE ADDRESS GIVEN BY THE "address" MESSAGE VALUE

        d_memory[rx.integer(1)] = rx.integer(2);
        break;

    // IF THE MESSAGE TYPE IS "Read"

    case MEM_READ:

        // READ THE VALUE OF THE MEMORY WORD AT THE ADDRESS GIVEN BY THE
        // "address" MESSAGE VALUE AND STORE IN THE REPLY MESSAGE

        d_tx->append(d_width, d_memory[rx.integer(1)]);
        break;

    // IF THE MESSAGE TYPE IS ILLEGAL

    default:
        cout << "SRAM::process: " << d_name << " ILLEGAL OPERATION" << endl;
    }

    // RETURN ANY REPLY MESSAGE

    return d_tx;
}
© Copyright 2000-2001 Adrian Lewis