Skip to content

Commit bbb32ee

Browse files
committed
ODIN_II: Add basic task support
1 parent 3683e2e commit bbb32ee

16 files changed

+1138
-25
lines changed

ODIN_II/SRC/ast_elaborate.cpp

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,44 @@ ast_node_t *finalize_ast(ast_node_t *node, ast_node_t *parent, STRING_CACHE_LIST
214214

215215
break;
216216
}
217+
case TASK:
218+
{
219+
if(parent != NULL)
220+
{
221+
skip_children = true;
222+
}
223+
break;
224+
}
225+
case TASK_INSTANCE:
226+
{
227+
// check ports
228+
ast_node_t *connect_list = node->children[1]->children[1];
229+
bool is_ordered_list;
230+
if (connect_list->children[1]->children[0]) // skip first connection
231+
{
232+
is_ordered_list = false; // name was specified
233+
}
234+
else
235+
{
236+
is_ordered_list = true;
237+
}
238+
239+
for (int i = 1; i < connect_list->num_children; i++)
240+
{
241+
if ((connect_list->children[i]
242+
&& connect_list->children[i]->children)
243+
&& (( connect_list->children[i]->children[0] && is_ordered_list)
244+
|| (!connect_list->children[i]->children[0] && !is_ordered_list)))
245+
{
246+
error_message(PARSE_ERROR, node->line_number, node->file_number,
247+
"%s", "Cannot mix port connections by name and port connections by ordered list\n");
248+
}
249+
}
250+
251+
skip_children = true;
252+
253+
break;
254+
}
217255
case MODULE_ITEMS:
218256
{
219257
/* look in the string cache for in-line continuous assignments */
@@ -761,6 +799,65 @@ ast_node_t *finalize_ast(ast_node_t *node, ast_node_t *parent, STRING_CACHE_LIST
761799
vtr::free(temp_instance_name);
762800
}
763801

802+
int task_offset = function_offset + i;
803+
for (i = 0; i < node->types.task.size_task_instantiations; i++)
804+
{
805+
806+
/* make the stringed up module instance name - instance name is
807+
* MODULE_INSTANCE->MODULE_NAMED_INSTANCE(child[1])->IDENTIFIER(child[0]).
808+
* module name is MODULE_INSTANCE->IDENTIFIER(child[0])
809+
*/
810+
ast_node_t *temp_instance = node->types.task.task_instantiations_instance[i];
811+
char *instance_name_prefix = local_string_cache_list->instance_name_prefix;
812+
813+
char *temp_instance_name = make_full_ref_name(instance_name_prefix,
814+
temp_instance->children[0]->types.identifier,
815+
temp_instance->children[1]->children[0]->types.identifier,
816+
NULL, -1);
817+
818+
long sc_spot;
819+
/* lookup the name of the task associated with this instantiated point */
820+
if ((sc_spot = sc_lookup_string(module_names_to_idx, temp_instance->children[0]->types.identifier)) == -1)
821+
{
822+
error_message(NETLIST_ERROR, node->line_number, node->file_number,
823+
"Can't find task name %s\n", temp_instance->children[0]->types.identifier);
824+
}
825+
826+
/* make a unique copy of this task */
827+
ast_node_t *instance = ast_node_deep_copy((ast_node_t *)module_names_to_idx->data[sc_spot]);
828+
829+
long sc_spot_2 = sc_add_string(module_names_to_idx, temp_instance_name);
830+
oassert(sc_spot_2 > -1 && module_names_to_idx->data[sc_spot_2] == NULL);
831+
module_names_to_idx->data[sc_spot_2] = (void *)instance;
832+
833+
ast_modules = (ast_node_t **)vtr::realloc(ast_modules, sizeof(ast_node_t*)*(sc_spot_2 + 1));
834+
ast_modules[sc_spot_2] = instance;
835+
836+
/* create the string cache list for the instantiated task */
837+
STRING_CACHE_LIST *task_string_cache_list = (STRING_CACHE_LIST*)vtr::calloc(1, sizeof(STRING_CACHE_LIST));
838+
task_string_cache_list->parent = local_string_cache_list;
839+
840+
int num_children = local_string_cache_list->num_children;
841+
local_string_cache_list->children = (STRING_CACHE_LIST **)vtr::realloc(local_string_cache_list->children, sizeof(STRING_CACHE_LIST *)*(num_children + 1));
842+
local_string_cache_list->children[task_offset + i] = task_string_cache_list;
843+
local_string_cache_list->num_children++;
844+
845+
task_string_cache_list->instance_name_prefix = vtr::strdup(temp_instance_name);
846+
task_string_cache_list->scope_id = vtr::strdup(temp_instance->children[1]->children[0]->types.identifier);
847+
848+
/* create the symbol table for the instantiated module */
849+
task_string_cache_list->local_symbol_table_sc = sc_new_string_cache();
850+
task_string_cache_list->num_local_symbol_table = 0;
851+
task_string_cache_list->local_symbol_table = NULL;
852+
create_symbol_table_for_scope(instance->children[2], task_string_cache_list);
853+
854+
/* elaboration */
855+
simplify_ast_module(&instance, task_string_cache_list);
856+
857+
/* clean up */
858+
vtr::free(temp_instance_name);
859+
}
860+
764861
break;
765862
}
766863
case MODULE_PARAMETER:
@@ -1131,6 +1228,11 @@ ast_node_t *reduce_expressions(ast_node_t *node, STRING_CACHE_LIST *local_string
11311228
skip_children = true;
11321229
break;
11331230
}
1231+
case TASK:
1232+
{
1233+
skip_children = true;
1234+
break;
1235+
}
11341236
case BLOCKING_STATEMENT:
11351237
case NON_BLOCKING_STATEMENT:
11361238
{

ODIN_II/SRC/ast_util.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,6 @@ char_list_t *get_name_of_pins(ast_node_t *var_node, char *instance_name_prefix,
704704
int width = 0;
705705

706706
STRING_CACHE *local_symbol_table_sc = local_string_cache_list->local_symbol_table_sc;
707-
708707
if (var_node->type == ARRAY_REF)
709708
{
710709
width = 1;

ODIN_II/SRC/include/odin_types.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,8 @@ enum ids
271271
FUNCTION,
272272
/* OTHER FUNCTION ITEMS */
273273
FUNCTION_ITEMS,
274+
TASK,
275+
TASK_ITEMS,
274276
/* primitives */
275277
GATE,
276278
GATE_INSTANCE,
@@ -287,6 +289,9 @@ enum ids
287289
/* Function instances*/
288290
FUNCTION_NAMED_INSTANCE,
289291
FUNCTION_INSTANCE,
292+
293+
TASK_NAMED_INSTANCE,
294+
TASK_INSTANCE,
290295
/* Specify Items */
291296
SPECIFY_ITEMS,
292297
SPECIFY_PARAMETER,
@@ -375,6 +380,13 @@ struct typ
375380
STRING_CACHE *parameter_list;
376381
} function;
377382
struct
383+
{
384+
short is_instantiated;
385+
ast_node_t **task_instantiations_instance;
386+
int size_task_instantiations;
387+
int index;
388+
}task;
389+
struct
378390
{
379391
int num_bit_strings;
380392
char **bit_strings;

ODIN_II/SRC/include/parse_making_ast.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ ast_node_t *newWhile(ast_node_t *compare_expression, ast_node_t *statement, int
5858
ast_node_t *newModuleConnection(char* id, ast_node_t *expression, int line_number);
5959
ast_node_t *newModuleNamedInstance(char* unique_name, ast_node_t *module_connect_list, ast_node_t *module_parameter_list, int line_number);
6060
ast_node_t *newFunctionNamedInstance(ast_node_t *module_connect_list, ast_node_t *module_parameter_list, int line_number);
61+
ast_node_t *newTaskInstance(char *task_name, ast_node_t *task_named_instace, ast_node_t *task_parameter_list, int line_number);
62+
ast_node_t *newTaskNamedInstance(ast_node_t *module_connect_list, int line_number);
6163
ast_node_t *newModuleInstance(char* module_ref_name, ast_node_t *module_named_instance, int line_number);
6264
ast_node_t *newFunctionInstance(char* function_ref_name, ast_node_t *function_named_instance, int line_number);
6365
ast_node_t *newHardBlockInstance(char* module_ref_name, ast_node_t *module_named_instance, int line_number);
@@ -80,9 +82,11 @@ ast_node_t *newIntegerTypeVarDeclare(char* symbol, ast_node_t *expression1, ast_
8082

8183
/* HIGH LEVEL ITEMS */
8284
ast_node_t *newModule(char* module_name, ast_node_t *list_of_parameters, ast_node_t *list_of_ports, ast_node_t *list_of_module_items, int line_number);
83-
ast_node_t *newFunction(ast_node_t *list_of_ports, ast_node_t *list_of_module_items, int line_number);
85+
ast_node_t *newFunction(ast_node_t *list_of_ports, ast_node_t *list_of_module_items, int line_number, bool automatic);
86+
ast_node_t *newTask(char *task_name, ast_node_t *list_of_ports, ast_node_t *list_of_task_items, int line_number, bool automatic);
8487
void next_module();
8588
void next_function();
89+
void next_task();
8690
ast_node_t *newDefparam(ids id, ast_node_t *val, int line_number);
8791

8892
void next_parsed_verilog_file(ast_node_t *file_items_list);

0 commit comments

Comments
 (0)