diff --git a/quad/src/computation_graph/computation_graph.c b/quad/src/computation_graph/computation_graph.c index 6422d5b11aa95df89dcdb57a3c82b9d1f4ce047a..527035eed8751a68c621d71b8660ca7a1d5f9884 100644 --- a/quad/src/computation_graph/computation_graph.c +++ b/quad/src/computation_graph/computation_graph.c @@ -11,9 +11,9 @@ static double exec_input_vals[GRAPH_MAX_INPUTS]; // Macro functions for setting and clearing single bits in int array // From http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html -#define setBit(A,k) ( A[(k / (8*sizeof(int)))] |= (1 << (k % (8*sizeof(int)))) ) -#define clearBit(A,k) ( A[(k / (8*sizeof(int)))] &= ~(1 << (k % (8*sizeof(int)))) ) -#define testBit(A,k) ( A[(k / (8*sizeof(int)))] & (1 << (k % (8*sizeof(int)))) ) +#define setBit(A,k) ( A[(k / (8*sizeof(&A)))] |= (1 << (k % (8*sizeof(&A)))) ) +#define clearBit(A,k) ( A[(k / (8*sizeof(&A)))] &= ~(1 << (k % (8*sizeof(&A)))) ) +#define testBit(A,k) ( A[(k / (8*sizeof(&A)))] & (1 << (k % (8*sizeof(&A)))) ) struct computation_graph *create_graph() { struct computation_graph *the_graph = malloc(sizeof(struct computation_graph)); @@ -74,7 +74,8 @@ int graph_set_source(struct computation_graph *graph, } struct graph_node *dest_node = &graph->nodes[dest_node_id]; struct graph_node *src_node = &graph->nodes[src_node_id]; - if (dest_input >= dest_node->type->n_inputs || src_output >= src_node->type->n_outputs) { + if (dest_input >= dest_node->type->n_inputs || src_output >= src_node->type->n_outputs || + dest_input < 0 || src_output < 0) { return -1; } @@ -182,14 +183,19 @@ double graph_get_output(const struct computation_graph *graph, int node_id, int return graph->nodes[node_id].output_values[output_id]; } +/* + * Assumptions: The node passed in is a valid ID (should be checked before passing) + * and all node sources are either valid node-output pairs, or the source node ID == -1 + * This function does not check those assumptions for speed +*/ void graph_compute_node_rec(struct computation_graph *graph, int node_id, int depth) { if (depth >= GRAPH_MAX_DEPTH) { - assert(1 == 0); // TODO :Xil_Assert false - return; - } - if (!graph_node_exists(graph, node_id)) { + assert(1 == 0); return; } + // if (!graph_node_exists(graph, node_id)) { + // return; + // } struct graph_node *node = &graph->nodes[node_id]; if (node->processed_state != UNPROCESSED) { return; @@ -226,9 +232,8 @@ void graph_compute_node_rec(struct computation_graph *graph, int node_id, int de void graph_compute_nodes(struct computation_graph *graph, int* node_ids, int n_nodes) { int i; for (i = 0; i < graph->size; i++) { - if (graph_node_exists(graph, i)) { - graph->nodes[i].processed_state = UNPROCESSED; - } + // Note: Do not access malloc'd members in here without first checking if node is valid + graph->nodes[i].processed_state = UNPROCESSED; } for (i = 0; i < n_nodes; i++) { int node_id = node_ids[i]; @@ -238,11 +243,10 @@ void graph_compute_nodes(struct computation_graph *graph, int* node_ids, int n_n } // Clear all the updated flags for nodes that were actually executed for (i = 0; i < graph->size; i++) { - if (graph_node_exists(graph, i)) { - struct graph_node* node = &graph->nodes[i]; - if (node->processed_state == PROCESSED) { - node->updated = 0; - } + // Note: Do not access malloc'd members in here without first checking if node is valid + struct graph_node* node = &graph->nodes[i]; + if (node->processed_state == PROCESSED) { + node->updated = 0; } } }