mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2025-01-18 09:30:11 +00:00
started on verilog scope, fixed code change, module top detect
This commit is contained in:
parent
0ca9f43098
commit
b19ebe76df
BIN
css/04B_03__.TTF
Normal file
BIN
css/04B_03__.TTF
Normal file
Binary file not shown.
@ -222,3 +222,7 @@ canvas.pixelated {
|
|||||||
#javatari-screen div {
|
#javatari-screen div {
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
}
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: TinyFont;
|
||||||
|
src: url(04B_03__.TTF);
|
||||||
|
}
|
||||||
|
@ -65,9 +65,9 @@ var RasterVideo = function(mainElement, width, height, options) {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getFrameData = function() {
|
this.getFrameData = function() { return datau32; }
|
||||||
return datau32;
|
|
||||||
}
|
this.getContext = function() { return ctx; }
|
||||||
|
|
||||||
this.updateFrame = function(sx, sy, dx, dy, width, height) {
|
this.updateFrame = function(sx, sy, dx, dy, width, height) {
|
||||||
//imageData.data.set(buf8); // TODO: slow w/ partial updates
|
//imageData.data.set(buf8); // TODO: slow w/ partial updates
|
||||||
|
@ -77,6 +77,7 @@ var VerilogPlatform = function(mainElement, options) {
|
|||||||
var gen;
|
var gen;
|
||||||
var frameRate = 60;
|
var frameRate = 60;
|
||||||
var AUDIO_FREQ = 15700;
|
var AUDIO_FREQ = 15700;
|
||||||
|
var current_output;
|
||||||
|
|
||||||
this.getPresets = function() { return VERILOG_PRESETS; }
|
this.getPresets = function() { return VERILOG_PRESETS; }
|
||||||
|
|
||||||
@ -96,6 +97,65 @@ var VerilogPlatform = function(mainElement, options) {
|
|||||||
0xffffffff,
|
0xffffffff,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function updateVideoFrame() {
|
||||||
|
var i=0;
|
||||||
|
for (var y=0; y<videoHeight; y++) {
|
||||||
|
for (var x=0; x<videoWidth; x++) {
|
||||||
|
tick2();
|
||||||
|
idata[i++] = RGBLOOKUP[gen.rgb];
|
||||||
|
}
|
||||||
|
var z=0;
|
||||||
|
while (gen.hsync && z++<videoWidth) tick2();
|
||||||
|
while (!gen.hsync && z++<videoWidth) tick2();
|
||||||
|
}
|
||||||
|
var z=0;
|
||||||
|
while (gen.vsync && z++<videoWidth*80) tick2();
|
||||||
|
while (!gen.vsync && z++<videoWidth*80) tick2();
|
||||||
|
video.updateFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
var yposlist = [];
|
||||||
|
|
||||||
|
function updateScopeFrame() {
|
||||||
|
var arr = current_output.ports;
|
||||||
|
if (!arr) return;
|
||||||
|
for (var i=0; i<idata.length; i++) {
|
||||||
|
if (idata[i])
|
||||||
|
idata[i] = 0; //<<= 1;
|
||||||
|
}
|
||||||
|
var COLOR_SIGNAL = 0xff11ff11;
|
||||||
|
var COLOR_BORDER = 0xff661111;
|
||||||
|
for (var x=0; x<videoWidth; x++) {
|
||||||
|
gen.clk ^= 1;
|
||||||
|
gen.eval();
|
||||||
|
var yb = 8;
|
||||||
|
var y1 = 0;
|
||||||
|
for (var i=0; i<arr.length; i++) {
|
||||||
|
var v = arr[i];
|
||||||
|
var lo = 0; // TODO? v.ofs?
|
||||||
|
var hi = v.len ? ((2 << v.len)-1) : 1;
|
||||||
|
var ys = hi>1 ? v.len*2+8 : 8;
|
||||||
|
var y2 = y1+ys;
|
||||||
|
var z = gen[v.name];
|
||||||
|
var y = y2 - ys*((z-lo)/hi);
|
||||||
|
yposlist[i] = y2;
|
||||||
|
//idata[x + y1*videoWidth] = COLOR_BORDER;
|
||||||
|
//idata[x + y2*videoWidth] = COLOR_BORDER;
|
||||||
|
idata[x + Math.round(y)*videoWidth] = COLOR_SIGNAL;
|
||||||
|
y1 += ys+yb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
video.updateFrame();
|
||||||
|
// draw labels
|
||||||
|
var ctx = video.getContext();
|
||||||
|
ctx.font = "8px TinyFont";
|
||||||
|
ctx.fillStyle = "white";
|
||||||
|
for (var i=0; i<arr.length; i++) {
|
||||||
|
var v = arr[i];
|
||||||
|
ctx.fillText(v.name, 1, yposlist[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.start = function() {
|
this.start = function() {
|
||||||
// TODO
|
// TODO
|
||||||
video = new RasterVideo(mainElement,videoWidth,videoHeight);
|
video = new RasterVideo(mainElement,videoWidth,videoHeight);
|
||||||
@ -106,30 +166,21 @@ var VerilogPlatform = function(mainElement, options) {
|
|||||||
timer = new AnimationTimer(frameRate, function() {
|
timer = new AnimationTimer(frameRate, function() {
|
||||||
if (!self.isRunning())
|
if (!self.isRunning())
|
||||||
return;
|
return;
|
||||||
var i=0;
|
if (gen.vsync !== undefined && gen.hsync !== undefined && gen.rgb !== undefined)
|
||||||
for (var y=0; y<videoHeight; y++) {
|
updateVideoFrame();
|
||||||
for (var x=0; x<videoWidth; x++) {
|
else
|
||||||
tick2();
|
updateScopeFrame();
|
||||||
idata[i++] = RGBLOOKUP[gen.rgb];
|
|
||||||
}
|
|
||||||
var z=0;
|
|
||||||
while (gen.hsync && z++<videoWidth) tick2();
|
|
||||||
while (!gen.hsync && z++<videoWidth) tick2();
|
|
||||||
}
|
|
||||||
var z=0;
|
|
||||||
while (gen.vsync && z++<videoWidth*80) tick2();
|
|
||||||
while (!gen.vsync && z++<videoWidth*80) tick2();
|
|
||||||
video.updateFrame();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.loadROM = function(title, modtext) {
|
this.loadROM = function(title, output) {
|
||||||
//console.log(modtext);
|
var mod = new Function('base', output.code);
|
||||||
var mod = new Function('base', modtext);
|
|
||||||
var base = new VerilatorBase();
|
var base = new VerilatorBase();
|
||||||
gen = new mod(base);
|
gen = new mod(base);
|
||||||
gen.__proto__ = base;
|
gen.__proto__ = base;
|
||||||
console.log(gen);
|
output.code = null;
|
||||||
|
output.ports_signals = output.ports.concat(output.signals);
|
||||||
|
current_output = output;
|
||||||
this.reset();
|
this.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,7 +457,7 @@ function setCompileOutput(data) {
|
|||||||
} else {
|
} else {
|
||||||
// load ROM
|
// load ROM
|
||||||
var rom = data.output;
|
var rom = data.output;
|
||||||
var rom_changed = rom && !arrayCompare(rom, current_output);
|
var rom_changed = rom && !arrayCompare(rom.code||rom, current_output);
|
||||||
if (rom_changed) {
|
if (rom_changed) {
|
||||||
try {
|
try {
|
||||||
//console.log("Loading ROM length", rom.length);
|
//console.log("Loading ROM length", rom.length);
|
||||||
|
@ -84,15 +84,17 @@ function translateVerilatorOutputToJS(htext, cpptext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
output:buildModule({
|
output:{
|
||||||
|
code:buildModule({
|
||||||
|
name:moduleName,
|
||||||
|
ports:ports,
|
||||||
|
signals:signals,
|
||||||
|
funcs:funcs,
|
||||||
|
}),
|
||||||
name:moduleName,
|
name:moduleName,
|
||||||
ports:ports,
|
ports:ports,
|
||||||
signals:signals,
|
signals:signals,
|
||||||
funcs:funcs,
|
}
|
||||||
}),
|
|
||||||
name:moduleName,
|
|
||||||
ports:ports,
|
|
||||||
signals:signals,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1031,6 +1031,11 @@ function assembleNAKEN(code, platform) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function detectModuleName(code) {
|
||||||
|
var m = /\bmodule\s+(\w+_top)/.exec(code) || /\bmodule\s+(\w+)/.exec(code);
|
||||||
|
return m ? m[1] : null;
|
||||||
|
}
|
||||||
|
|
||||||
function compileVerilator(code, platform) {
|
function compileVerilator(code, platform) {
|
||||||
loadWASM("verilator_bin");
|
loadWASM("verilator_bin");
|
||||||
load("verilator2js");
|
load("verilator2js");
|
||||||
@ -1042,10 +1047,11 @@ function compileVerilator(code, platform) {
|
|||||||
print:print_fn,
|
print:print_fn,
|
||||||
printErr:match_fn,
|
printErr:match_fn,
|
||||||
});
|
});
|
||||||
// detect module_top name
|
var topmod = detectModuleName(code) || "top";
|
||||||
var topmod = "top";
|
|
||||||
var m = /\bmodule\s+(\w+?_top)/.exec(code);
|
var m = /\bmodule\s+(\w+?_top)/.exec(code);
|
||||||
if (m && m[1]) topmod = m[1];
|
if (m && m[1]) topmod = m[1];
|
||||||
|
m = /\bmodule\s+(\w+?_top)/.exec(code);
|
||||||
|
if (m && m[1]) topmod = m[1];
|
||||||
var FS = verilator_mod['FS'];
|
var FS = verilator_mod['FS'];
|
||||||
//setupFS(FS);
|
//setupFS(FS);
|
||||||
FS.writeFile(topmod+".v", code);
|
FS.writeFile(topmod+".v", code);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user