Package com.cburch.logisim.std.memory

Source Code of com.cburch.logisim.std.memory.ShiftRegisterData

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.std.memory;

import java.util.Arrays;

import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.instance.InstanceData;

class ShiftRegisterData extends ClockState implements InstanceData {
  private BitWidth width;
  private Value[] vs;
  private int vsPos;
 
  public ShiftRegisterData(BitWidth width, int len) {
    this.width = width;
    this.vs = new Value[len];
    Arrays.fill(this.vs, Value.createKnown(width, 0));
    this.vsPos = 0;
  }
 
  @Override
  public ShiftRegisterData clone() {
    ShiftRegisterData ret = (ShiftRegisterData) super.clone();
    ret.vs = this.vs.clone();
    return ret;
  }
 
  public int getLength() {
    return vs.length;
  }
 
  public void setDimensions(BitWidth newWidth, int newLength) {
    Value[] v = vs;
    BitWidth oldWidth = width;
    int oldW = oldWidth.getWidth();
    int newW = newWidth.getWidth();
    if (v.length != newLength) {
      Value[] newV = new Value[newLength];
      int j = vsPos;
      int copy = Math.min(newLength, v.length);
      for (int i = 0; i < copy; i++) {
        newV[i] = v[j];
        j++;
        if (j == v.length) j = 0;
      }
      Arrays.fill(newV, copy, newLength, Value.createKnown(newWidth, 0));
      v = newV;
      vsPos = 0;
      vs = newV;
    }
    if (oldW != newW) {
      for (int i = 0; i < v.length; i++) {
        Value vi = v[i];
        if (vi.getWidth() != newW) {
          v[i] = vi.extendWidth(newW, Value.FALSE);
        }
      }
      width = newWidth;
    }
  }
 
  public void clear() {
    Arrays.fill(vs, Value.createKnown(width, 0));
    vsPos = 0;
  }
 
  public void push(Value v) {
    int pos = vsPos;
    vs[pos] = v;
    vsPos = pos >= vs.length - 1 ? 0 : pos + 1;
  }
 
  public Value get(int index) {
    int i = vsPos + index;
    Value[] v = vs;
    if (i >= v.length) i -= v.length;
    return v[i];
  }
 
  public void set(int index, Value val) {
    int i = vsPos + index;
    Value[] v = vs;
    if (i >= v.length) i -= v.length;
    v[i] = val;
  }
}
TOP

Related Classes of com.cburch.logisim.std.memory.ShiftRegisterData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.