mirror of
https://github.com/trebonian/visual6502.git
synced 2025-02-11 08:32:23 +00:00
Performance - use forEach, and more cleanup
This commit is contained in:
parent
b5e1064efb
commit
33aa993c8d
90
chipsim.js
90
chipsim.js
@ -24,12 +24,14 @@ var ctrace = false;
|
|||||||
var traceTheseNodes = [];
|
var traceTheseNodes = [];
|
||||||
var traceTheseTransistors = [];
|
var traceTheseTransistors = [];
|
||||||
var loglevel = 0;
|
var loglevel = 0;
|
||||||
var ridx = 0;
|
var recalclist = new Array();
|
||||||
|
var recalcHash = new Array();
|
||||||
|
var group = new Array();
|
||||||
|
|
||||||
function recalcNodeList(list){
|
function recalcNodeList(list){
|
||||||
var n = list[0];
|
var n = list[0];
|
||||||
var recalclist = new Array();
|
recalclist = new Array();
|
||||||
var recalcHash = {};
|
recalcHash = new Array();
|
||||||
for(var j=0;j<100;j++){ // loop limiter
|
for(var j=0;j<100;j++){ // loop limiter
|
||||||
if(list.length==0) return;
|
if(list.length==0) return;
|
||||||
if(ctrace) {
|
if(ctrace) {
|
||||||
@ -43,61 +45,58 @@ function recalcNodeList(list){
|
|||||||
console.log('recalcNodeList iteration: ', j, list.length, 'nodes', list);
|
console.log('recalcNodeList iteration: ', j, list.length, 'nodes', list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(var i in list) recalcNode(list[i], recalclist, recalcHash);
|
for(var i in list) recalcNode(list[i]);
|
||||||
list = recalclist;
|
list = recalclist;
|
||||||
recalclist = new Array();
|
recalclist = new Array();
|
||||||
recalcHash = {};
|
recalcHash = new Array();
|
||||||
}
|
}
|
||||||
if(ctrace) console.log(n,'looping...');
|
if(ctrace) console.log(n,'looping...');
|
||||||
}
|
}
|
||||||
|
|
||||||
function recalcNode(node, recalclist, recalcHash){
|
function recalcNode(node){
|
||||||
if(node==ngnd) return;
|
if(node==ngnd) return;
|
||||||
if(node==npwr) return;
|
if(node==npwr) return;
|
||||||
var group = getNodeGroup(node);
|
group = getNodeGroup(node);
|
||||||
var newv = getNodeValue(group);
|
var newv = getNodeValue();
|
||||||
var newState = (newv[0]=='h');
|
var newState = (newv[0]=='h');
|
||||||
var newFloat = (newv[1]=='f');
|
var newFloat = (newv[1]=='f');
|
||||||
if(ctrace && (traceTheseNodes.indexOf(node)!=-1))
|
if(ctrace && (traceTheseNodes.indexOf(node)!=-1))
|
||||||
console.log('recalc', node, group);
|
console.log('recalc', node, group);
|
||||||
for(var i in group){
|
for(var i in group){
|
||||||
var n = nodes[group[i]];
|
var n = nodes[group[i]];
|
||||||
var oldState = n.state;
|
|
||||||
if(n.state==newState && n.float==newFloat)continue; /******Performance********/
|
|
||||||
if(n.state!=newState && ctrace && (traceTheseNodes.indexOf(n)!=-1))
|
|
||||||
console.log(group[i], n.state, newv);
|
|
||||||
n.state = newState;
|
|
||||||
n.float = newFloat;
|
n.float = newFloat;
|
||||||
if(n.state==oldState)
|
if(n.state==newState)continue; /******Performance********/
|
||||||
continue;
|
n.state = newState;
|
||||||
for(var t in n.gates) recalcTransistor(n.gates[t], recalclist, recalcHash);
|
n.gates.forEach(
|
||||||
|
function(t){
|
||||||
|
recalcTransistor(t);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function recalcTransistor(tn, recalclist, recalcHash){
|
function recalcTransistor(t){
|
||||||
var t = transistors[tn];
|
if(isNodeHigh(t.gate)) turnTransistorOn(t);
|
||||||
if(isNodeHigh(t.gate)) turnTransistorOn(t, recalclist, recalcHash);
|
else turnTransistorOff(t);
|
||||||
else turnTransistorOff(t, recalclist, recalcHash);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function turnTransistorOn(t, recalclist, recalcHash){
|
function turnTransistorOn(t){
|
||||||
if(t.on) return;
|
if(t.on) return;
|
||||||
if(ctrace && (traceTheseTransistors.indexOf(t.name)!=-1))
|
if(ctrace && (traceTheseTransistors.indexOf(t.name)!=-1))
|
||||||
console.log(t.name, 'on', t.gate, t.c1, t.c2);
|
console.log(t.name, 'on', t.gate, t.c1, t.c2);
|
||||||
t.on = true;
|
t.on = true;
|
||||||
addRecalcNode(t.c1, recalclist, recalcHash);
|
addRecalcNode(t.c1);
|
||||||
addRecalcNode(t.c2, recalclist, recalcHash);
|
addRecalcNode(t.c2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function turnTransistorOff(t, recalclist, recalcHash){
|
function turnTransistorOff(t){
|
||||||
if(!t.on) return;
|
if(!t.on) return;
|
||||||
if(ctrace && (traceTheseTransistors.indexOf(t.name)!=-1))
|
if(ctrace && (traceTheseTransistors.indexOf(t.name)!=-1))
|
||||||
console.log(t.name, 'off', t.gate, t.c1, t.c2);
|
console.log(t.name, 'off', t.gate, t.c1, t.c2);
|
||||||
t.on = false;
|
t.on = false;
|
||||||
floatnode(t.c1);
|
floatnode(t.c1);
|
||||||
floatnode(t.c2);
|
floatnode(t.c2);
|
||||||
addRecalcNode(t.c1, recalclist, recalcHash);
|
addRecalcNode(t.c1);
|
||||||
addRecalcNode(t.c2, recalclist, recalcHash);
|
addRecalcNode(t.c2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function floatnode(nn){
|
function floatnode(nn){
|
||||||
@ -109,46 +108,45 @@ function floatnode(nn){
|
|||||||
console.log('floating', nn, 'at', n.state);
|
console.log('floating', nn, 'at', n.state);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addRecalcNode(nn, recalclist, recalcHash){
|
function addRecalcNode(nn){
|
||||||
if(nn==ngnd) return;
|
if(nn==ngnd) return;
|
||||||
if(nn==npwr) return;
|
if(nn==npwr) return;
|
||||||
if(recalcHash[nn] == 1)return;
|
if(recalcHash[nn] == 1)return;
|
||||||
// if(arrayContains(recalclist, nn)) return;
|
|
||||||
recalclist.push(nn);
|
recalclist.push(nn);
|
||||||
recalcHash[nn] = 1;
|
recalcHash[nn] = 1;
|
||||||
// setAdd(recalclist, nn);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNodeGroup(i){
|
function getNodeGroup(i){
|
||||||
var group = new Array();
|
group = new Array();
|
||||||
addNodeToGroup(i, group);
|
addNodeToGroup(i);
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addNodeToGroup(i, group){
|
function addNodeToGroup(i){
|
||||||
// if(arrayContains(group, i)) return;
|
|
||||||
if(group.indexOf(i) != -1) return;
|
if(group.indexOf(i) != -1) return;
|
||||||
group.push(i);
|
group.push(i);
|
||||||
if(i==ngnd) return;
|
if(i==ngnd) return;
|
||||||
if(i==npwr) return;
|
if(i==npwr) return;
|
||||||
addNodeToGroup1(i, group);
|
addNodeToGroup1(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
function addNodeToGroup1(i,group){
|
function addNodeToGroup1(i){
|
||||||
for(var t in nodes[i].c1c2s) addNodeTransistor(i, nodes[i].c1c2s[t], group);
|
var output=nodes[i].c1c2s;
|
||||||
|
output.forEach(
|
||||||
|
function(t){
|
||||||
|
if(t.on)addNodeTransistor(i,t);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function addNodeTransistor(node, t, group){
|
function addNodeTransistor(node, tr){
|
||||||
var tr = transistors[t];
|
|
||||||
if(!tr.on) return;
|
|
||||||
var other;
|
var other;
|
||||||
if(tr.c1==node) other=tr.c2;
|
if(tr.c1==node) other=tr.c2;
|
||||||
if(tr.c2==node) other=tr.c1;
|
if(tr.c2==node) other=tr.c1;
|
||||||
addNodeToGroup(other, group);
|
addNodeToGroup(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getNodeValue(group){
|
function getNodeValue(){
|
||||||
if(arrayContains(group, ngnd)) return 'l ';
|
if(arrayContains(group, ngnd)) return 'l ';
|
||||||
if(arrayContains(group, npwr)) return 'h ';
|
if(arrayContains(group, npwr)) return 'h ';
|
||||||
var flstate;
|
var flstate;
|
||||||
@ -203,7 +201,7 @@ function showState(str){
|
|||||||
nodes[i].state = ((codes[str[i]])[0]=='h');
|
nodes[i].state = ((codes[str[i]])[0]=='h');
|
||||||
nodes[i].float = ((codes[str[i]])[1]=='f');
|
nodes[i].float = ((codes[str[i]])[1]=='f');
|
||||||
var gates = nodes[i].gates;
|
var gates = nodes[i].gates;
|
||||||
for(var t in gates) transistors[gates[t]].on = isNodeHigh(i);
|
gates.forEach(function(t){t.on=isNodeHigh(i);});
|
||||||
}
|
}
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
@ -229,12 +227,4 @@ function setLow(name){
|
|||||||
recalcNodeList([nn]);
|
recalcNodeList([nn]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setAdd(arr, el){
|
|
||||||
var idx = ridx%(arr.length+1);
|
|
||||||
ridx+=131;
|
|
||||||
ridx%=123;
|
|
||||||
arr.splice(idx, 0, el);
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
function arrayContains(arr, el){return arr.indexOf(el)!=-1;}
|
function arrayContains(arr, el){return arr.indexOf(el)!=-1;}
|
||||||
|
@ -172,6 +172,10 @@ var goldenChecksum;
|
|||||||
|
|
||||||
// simulate a single clock phase, updating trace and highlighting layout
|
// simulate a single clock phase, updating trace and highlighting layout
|
||||||
function step(){
|
function step(){
|
||||||
|
if(!animateChipLayout){
|
||||||
|
halfStep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
var s=stateString();
|
var s=stateString();
|
||||||
var m=getMem();
|
var m=getMem();
|
||||||
trace[cycle]= {chip: s, mem: m};
|
trace[cycle]= {chip: s, mem: m};
|
||||||
@ -316,7 +320,7 @@ function clkNodes(){
|
|||||||
var res = Array();
|
var res = Array();
|
||||||
res.push(943);
|
res.push(943);
|
||||||
for(var i in nodes[943].gates){
|
for(var i in nodes[943].gates){
|
||||||
var t = transistors[nodes[943].gates[i]];
|
var t = nodes[943].gates[i];
|
||||||
if(t.c1==npwr) res.push(t.c2);
|
if(t.c1==npwr) res.push(t.c2);
|
||||||
if(t.c2==npwr) res.push(t.c1);
|
if(t.c2==npwr) res.push(t.c1);
|
||||||
}
|
}
|
||||||
|
6
wires.js
6
wires.js
@ -51,9 +51,9 @@ function setupTransistors(){
|
|||||||
var c1 = tdef[2];
|
var c1 = tdef[2];
|
||||||
var c2 = tdef[3];
|
var c2 = tdef[3];
|
||||||
var trans = {name: name, on: false, gate: gate, c1: c1, c2: c2};
|
var trans = {name: name, on: false, gate: gate, c1: c1, c2: c2};
|
||||||
nodes[gate].gates.push(name);
|
nodes[gate].gates.push(trans);
|
||||||
nodes[c1].c1c2s.push(name);
|
nodes[c1].c1c2s.push(trans);
|
||||||
nodes[c2].c1c2s.push(name);
|
nodes[c2].c1c2s.push(trans);
|
||||||
transistors[name] = trans;
|
transistors[name] = trans;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user