#ifndef AST_UTIL_H
#define AST_UTIL_H

#include "odin_types.h"

void add_tag_data();

ast_node_t* create_node_w_type_no_count(ids id, int line_number, int file_number);
ast_node_t* create_node_w_type(ids id, int line_number, int file_number);
ast_node_t* create_tree_node_id(char* string, int line_number, int file_number);

ast_node_t *create_tree_node_number(char *input_number, int line_number, int file_number);
ast_node_t *create_tree_node_number(VNumber& input_number, int line_number, int file_number);
ast_node_t *create_tree_node_number(long input_number, int line_number, int file_number);

void initial_node(ast_node_t *node, ids id, int line_number, int file_number, int counter);

void allocate_children_to_node(ast_node_t* node, std::vector<ast_node_t *> children_list);
void add_child_to_node(ast_node_t* node, ast_node_t *child);
void add_child_to_node_at_index(ast_node_t* node, ast_node_t *child, int index);
void remove_child_from_node_at_index(ast_node_t* node, int index);
ast_node_t **expand_node_list_at(ast_node_t **list, long old_size, long to_add, long start_idx);
void move_ast_node(ast_node_t *src, ast_node_t *dest, ast_node_t *node);
ast_node_t *ast_node_deep_copy(ast_node_t *node);
ast_node_t *ast_node_copy(ast_node_t *node);

void free_all_children(ast_node_t *node);
ast_node_t *free_whole_tree(ast_node_t *node);
void free_resolved_children(ast_node_t *node);
ast_node_t *free_resolved_tree(ast_node_t *node);
ast_node_t *free_single_node(ast_node_t *node);
void free_assignement_of_node_keep_tree(ast_node_t *node);

void make_concat_into_list_of_strings(ast_node_t *concat_top, char *instance_name_prefix, sc_hierarchy *local_ref);
void change_to_number_node(ast_node_t *node, long number);
void change_to_number_node(ast_node_t *node, VNumber number);

char *get_name_of_pin_at_bit(ast_node_t *var_node, int bit, char *instance_name_prefix, sc_hierarchy *local_ref);
char *get_name_of_var_declare_at_bit(ast_node_t *var_declare, int bit);
char_list_t *get_name_of_pins(ast_node_t *var_node, char *instance_name_prefix, sc_hierarchy *local_ref);
char_list_t *get_name_of_pins_with_prefix(ast_node_t *var_node, char *instance_name_prefix, sc_hierarchy *local_ref);
long get_size_of_variable(ast_node_t *node, sc_hierarchy *local_ref);

bool node_is_constant(ast_node_t *node);
ast_node_t *fold_binary(ast_node_t **node);
ast_node_t *fold_unary(ast_node_t **node);

long clog2(long value_in, int length);
long resolve_concat_sizes(ast_node_t *node_top, sc_hierarchy *local_ref);

#endif
