CircuitOnline/public/js/eeprom.js

77 lines
2.2 KiB
JavaScript

/**
* EEPROM Component.
*
* This is basically a RAM component that persists its contents.
*
* We consider EEPROMs more 'expensive' than RAMs, so we arbitrarily limit
* the addressWith to a maximum of 10 bits (1024 addresses) with a default of 8-bit (256).
*
* In the EEPROM all addresses are initialized to zero.
* This way we serialize unused values as "0" instead of "null".
*
* These two techniques help keep reduce the size of saved projects.
*/
function EEPROM(x, y, scope = globalScope, dir = "RIGHT", bitWidth = 8, addressWidth = 8, data = null) {
RAM.call(this, x, y, scope, dir, bitWidth, addressWidth);
this.data = data || this.data;
}
EEPROM.prototype = Object.create(RAM.prototype);
EEPROM.prototype.tooltipText = "Electrically Erasable Programmable Read-Only Memory";
EEPROM.prototype.constructor = EEPROM;
EEPROM.prototype.shortName = "EEPROM";
EEPROM.prototype.maxAddressWidth = 10;
EEPROM.prototype.helplink = "https://docs.circuitverse.org/#/memoryElements?id=eeprom";
EEPROM.prototype.mutableProperties = {
"addressWidth": {
name: "Address Width",
type: "number",
max: "10",
min: "1",
func: "changeAddressWidth",
},
"dump": RAM.prototype.mutableProperties.dump,
"reset": RAM.prototype.mutableProperties.reset,
}
EEPROM.prototype.customSave = function () {
var saveInfo = RAM.prototype.customSave.call(this);
// Normalize this.data to use zeroes instead of null when serialized.
var data = this.data;
for (var i = 0; i < data.length; i++) {
data[i] = data[i] || 0;
}
saveInfo.constructorParamaters.push(data);
return saveInfo;
}
//This is a EERAM without a clock - not normal
//reset is supported
EEPROM.moduleVerilog = function () {
return `
module EEPROM(dout, addr, din, we, dmp, rst);
parameter WIDTH = 8;
parameter ADDR = 10;
output [WIDTH-1:0] dout;
input [ADDR-1:0] addr;
input [WIDTH-1:0] din;
input we;
input dmp;
input rst;
reg [WIDTH-1:0] mem[2**ADDR-1:0];
integer j;
assign dout = mem[addr];
always @ (*) begin
if (!rst)
for (j=0; j < 2**ADDR-1; j=j+1) begin
mem[j] = 0;
end
if (!we)
mem[addr] = din;
dout = mem[addr];
end
endmodule
`;
}