1
0
mirror of https://github.com/mist64/perfect6502.git synced 2024-06-25 20:29:40 +00:00

remove dep_count after initialization, use differences

This commit is contained in:
ChrisCoxArt 2021-09-29 15:54:16 -07:00
parent 98caf992b4
commit efaf184508

View File

@ -430,14 +430,16 @@ recalcNode(state_t *state, nodenum_t node)
} }
if (newv) { if (newv) {
const nodenum_t dep_left_count = state->nodes_left_dep_count[nn]; const nodenum_t dep_offset = state->nodes_left_dependant[nn];
const nodenum_t *deps_left = state->dependent_block + state->nodes_left_dependant[nn]; const nodenum_t dep_left_count = state->nodes_left_dependant[nn+1] - dep_offset;
const nodenum_t *deps_left = state->dependent_block + dep_offset;
for (count_t g = 0; g < dep_left_count; g++) { for (count_t g = 0; g < dep_left_count; g++) {
listout_add(state, deps_left[g]); listout_add(state, deps_left[g]);
} }
} else { } else {
const nodenum_t dep_count = state->nodes_dep_count[nn]; const nodenum_t dep_offset = state->nodes_dependant[nn];
const nodenum_t *deps = state->dependent_block + state->nodes_dependant[nn]; const nodenum_t dep_count = state->nodes_dependant[nn+1] - dep_offset;
const nodenum_t *deps = state->dependent_block + dep_offset;
for (count_t g = 0; g < dep_count; g++) { for (count_t g = 0; g < dep_count; g++) {
listout_add(state, deps[g]); listout_add(state, deps[g]);
} }
@ -530,8 +532,11 @@ add_nodes_left_dependant(state_t *state, nodenum_t a, nodenum_t b)
Working set = 207 KB allocations, 220 KB binary, plus system libs Working set = 207 KB allocations, 220 KB binary, plus system libs
= 1.1 MB in release build = 1.1 MB in release build
down to 188K down to 188K after nodes_gates
Now 168K KB allocations and 23737 steps/second down to 168K after dependencies and left_dependencies
down to 145K after removing dep_counts
Now 145K KB allocations and 23737 steps/second
*/ */
state_t * state_t *
@ -547,6 +552,7 @@ setupNodesAndTransistors(netlist_transdefs *transdefs, BOOL *node_is_pullup, nod
/* chip state - remains static during simulation */ /* chip state - remains static during simulation */
state->nodes_gatecount = calloc(state->nodes, sizeof(*state->nodes_gatecount)); state->nodes_gatecount = calloc(state->nodes, sizeof(*state->nodes_gatecount));
state->nodes_c1c2offset = calloc(state->nodes + 1, sizeof(*state->nodes_c1c2offset)); state->nodes_c1c2offset = calloc(state->nodes + 1, sizeof(*state->nodes_c1c2offset));
state->nodes_dep_count = calloc(state->nodes, sizeof(*state->nodes_dep_count)); state->nodes_dep_count = calloc(state->nodes, sizeof(*state->nodes_dep_count));
state->nodes_left_dep_count = calloc(state->nodes, sizeof(*state->nodes_left_dep_count)); state->nodes_left_dep_count = calloc(state->nodes, sizeof(*state->nodes_left_dep_count));
@ -715,12 +721,7 @@ could also move to differences if needed, but we don't often use the counts
nodenum_t *block_dep = calloc( block_dep_size, sizeof(*state->nodes_dependant) ); nodenum_t *block_dep = calloc( block_dep_size, sizeof(*state->nodes_dependant) );
state->dependent_block = block_dep; state->dependent_block = block_dep;
/* Assign pointers from our larger block, using only counts needed /* Assign pointers from our larger block, using only counts needed */
TODO: ccox - should this use offsets like the c1c2 list?????
state->nodes_dependant[i] becomes state->dependent_block + state->nodes_dependant[i]
TODO: ccox - should this use differences like c1c2 list?
TODO: ccox - is there any reason to interleave the left and right data? is there anywhere that would improve caching?
*/
state->nodes_dependant = malloc((nodes+1) * sizeof(*state->nodes_dependant)); state->nodes_dependant = malloc((nodes+1) * sizeof(*state->nodes_dependant));
nodenum_t dep_index = 0; nodenum_t dep_index = 0;
for (i = 0; i < state->nodes; i++) { for (i = 0; i < state->nodes; i++) {
@ -728,7 +729,7 @@ TODO: ccox - is there any reason to interleave the left and right data? is ther
state->nodes_dependant[i] = dep_index; state->nodes_dependant[i] = dep_index;
dep_index += count; dep_index += count;
} }
state->nodes_dependant[state->nodes] = dep_index; /* TODO: ccox - if we want to use differences */ state->nodes_dependant[state->nodes] = dep_index;
state->nodes_left_dependant = malloc((nodes+1) * sizeof(*state->nodes_left_dependant)); state->nodes_left_dependant = malloc((nodes+1) * sizeof(*state->nodes_left_dependant));
for (i = 0; i < state->nodes; i++) { for (i = 0; i < state->nodes; i++) {
@ -736,7 +737,7 @@ TODO: ccox - is there any reason to interleave the left and right data? is ther
state->nodes_left_dependant[i] = dep_index; state->nodes_left_dependant[i] = dep_index;
dep_index += count; dep_index += count;
} }
state->nodes_left_dependant[state->nodes] = dep_index; /* TODO: ccox - if we want to use differences */ state->nodes_left_dependant[state->nodes] = dep_index;
/* Copy dependencies into smaller data structures */ /* Copy dependencies into smaller data structures */
for (i = 0; i < state->nodes; i++) { for (i = 0; i < state->nodes; i++) {
@ -760,6 +761,10 @@ TODO: ccox - is there any reason to interleave the left and right data? is ther
} }
} }
} }
free(state->nodes_dep_count);
free(state->nodes_left_dep_count);
state->nodes_dep_count = NULL;
state->nodes_left_dep_count = NULL;
#if 0 /* unnecessary - RESET will stabilize the network anyway */ #if 0 /* unnecessary - RESET will stabilize the network anyway */
/* all nodes are down */ /* all nodes are down */
@ -785,8 +790,6 @@ destroyNodesAndTransistors(state_t *state)
free(state->nodes_c1c2s); free(state->nodes_c1c2s);
free(state->nodes_gatecount); free(state->nodes_gatecount);
free(state->nodes_c1c2offset); free(state->nodes_c1c2offset);
free(state->nodes_dep_count);
free(state->nodes_left_dep_count);
free(state->dependent_block); free(state->dependent_block);
free(state->transistors_gate); free(state->transistors_gate);
free(state->transistors_c1); free(state->transistors_c1);