Raw File
reg.h
#ifndef reg_H
#define reg_H
#include <iostream>
#include <ostream>
#include <string.h>
#include <stdio.h>

using namespace std;

class reg
{
public:
  virtual unsigned
  read()
  {
    return mask & slaveVal;
  }
  virtual void
  write(unsigned v)
  {
    load = true;
    masterVal = mask & v;
  }
  // asynchronous clear
  void
  clear()
  {
    slaveVal = 0;
  }
  // load is set when a register is written into.
  void
  clk()
  {
    if (load)
      slaveVal = masterVal;
    load = false;
  }
  unsigned
  readField(unsigned msb, unsigned lsb); // bitfield numbered n - 1
  void
  writeField(unsigned msb, unsigned lsb, unsigned v); // bitfield numbered n - 1
  // Write a 16-bit word (in) into the register. Transpose the bits according to
  // the specification (ib).
  void
  writeShift(unsigned in, unsigned* ib);
  // Return a shifted 16-bit word. Transpose the 'in' bits according to
  // the specification 'ib'. 'Or' the result to out and return the value.
  unsigned
  shiftData(unsigned out, unsigned in, unsigned* ib);
  unsigned
  outmask()
  {
    return mask;
  }
protected:
  virtual
  ~reg()
  {
  }
  reg(unsigned s, const char* fs) :
      size(s), mask(0), masterVal(0), slaveVal(0), fmtString(fs), load(false)
  {
    mask = buildMask(size);
  }
  static unsigned
  buildMask(unsigned s);
  friend ostream&
  operator <<(ostream& os, const reg& r)
  {
    char buf[32];
    sprintf(buf, r.fmtString, r.slaveVal);
    os << buf;
    return os;
  }
private:
  unsigned size; // bits
  unsigned masterVal;
  unsigned slaveVal;
  unsigned mask;
  const char* fmtString;
  bool load;
  reg(); // prevent instantiation of default constructor
};
#endif

back to top