#ifndef ARCH_UTIL_H
#define ARCH_UTIL_H

#include "physical_types.h"

void free_arch(t_arch* arch);

void free_type_descriptors(t_type_descriptor* type_descriptors, int num_type_descriptors);

t_port * findPortByName(const char * name, t_pb_type * pb_type,
		int * high_index, int * low_index);

void SetupEmptyType(t_type_descriptor* cb_type_descriptors,
                    t_type_ptr EMPTY_TYPE);

void alloc_and_load_default_child_for_pb_type( t_pb_type *pb_type,
		char *new_name, t_pb_type *copy);

void ProcessLutClass(t_pb_type *lut_pb_type);


void ProcessMemoryClass(t_pb_type *mem_pb_type);

e_power_estimation_method power_method_inherited(
		e_power_estimation_method parent_power_method);

void CreateModelLibrary(t_arch *arch);

void SyncModelsPbTypes(t_arch *arch,
		const t_type_descriptor * Types, const int NumTypes);

void SyncModelsPbTypes_rec(t_arch *arch,
		t_pb_type * pb_type);

void UpdateAndCheckModels(t_arch *arch);


void primitives_annotation_clock_match(
		t_pin_to_pin_annotation *annotation, t_pb_type * parent_pb_type);

bool segment_exists(const t_arch* arch, std::string name);
t_segment_inf* find_segment(const t_arch* arch, std::string name);
bool is_library_model(const char* model_name);
bool is_library_model(const t_model* model);
#endif
