void MemDevice::WriteData()

in src/dpi/module.cc [243:272]


void MemDevice::WriteData(svOpenArrayHandle value, uint64_t wr_strb) {

  int lftIdx = svLeft(value, 1);
  int rgtIdx = svRight(value, 1);
  int blkNb  = lftIdx - rgtIdx + 1;
  assert(lftIdx >= 0);
  assert(rgtIdx >= 0);
  assert(lftIdx >= rgtIdx);
  assert(blkNb > 0);
  // supported up to 64bit strb
  assert(blkNb <= 8);

  std::lock_guard<std::mutex> lock(mutex_);
  int strbMask = 0xff;
  if (wlen_ > 0) {
    for (int idx = 0 ; idx < blkNb; ++idx) {
      int strbFlags = (wr_strb >> (idx * 8)) & strbMask;
      if (!(strbFlags == 0 || strbFlags == strbMask)) {
        LOG(FATAL) << "Unexpected strb data " << (void*)wr_strb;
      }
      if (strbFlags != 0) {
        uint64_t* elemPtr = (uint64_t*)svGetArrElemPtr1(value, rgtIdx + idx);
        assert(elemPtr != NULL);
        waddr_[idx] = (*elemPtr);
      }
    }
    waddr_ += blkNb;
    wlen_ -= 1;
  }
}