/*
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef SIMULATE_BLIF_H
#define SIMULATE_BLIF_H
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unordered_map>


#define SIM_WAVE_LENGTH 16
#define BUFFER_MAX_SIZE 1024

#include <queue>
#include "sim_block.h"
#include "odin_types.h"
#include "odin_globals.h"

#include "netlist_utils.h"
#include "odin_util.h"

#include "multipliers.h"
#include "hard_blocks.h"
#include "odin_types.h"
#include "memories.h"

/*
 * Number of values to store for each pin at one time.
 * Determines how frequently we have to write to disk.
 */
#define INPUT_VECTOR_FILE_NAME "input_vectors"
#define OUTPUT_VECTOR_FILE_NAME "output_vectors"
#define OUTPUT_ACTIVITY_FILE_NAME "output_activity"
#define MODEL_SIM_FILE_NAME "test.do"

#define DEFAULT_CLOCK_NAME "GLOBAL_SIM_BASE_CLK"

struct line_t{
	int number_of_pins;
	int max_number_of_pins;
	npin_t **pins;
	int  *pin_numbers;
	char *name;
	int type;
};

struct lines_t{
	line_t **lines;
	int    *pin_numbers;
	int    count;
};

struct stages_t{
	nnode_t ***stages; // Stages.
	int       *counts; // Number of nodes in each stage.
	int 	   count;  // Number of stages.

	// Statistics.
	int    num_nodes;          // The total number of nodes.
	int    num_connections;    // The sum of the number of children found under every node.
	int    *num_children;      // Number of children per stage.
	double    avg_worker_count; // The raio of node to be computed in parallel.

	double times;
	int worker_const;
	int worker_temp;
	bool warned;
};

//maria
struct netlist_subset{
	nnode_t **nodes;
	int number_of_nodes;
};

//maria
struct thread_node_distribution{
	netlist_subset **thread_nodes;
	int number_of_threads;
	netlist_subset *memory_nodes; //pointers to memory nodes
};


struct test_vector{
	signed char  **values;
	int           *counts;
	int            count;
};

struct sim_data_t
{
	//maria
	lines_t **input_lines_per_wave;
	lines_t **output_lines_per_wave;

	// Create and verify the lines.
	lines_t *input_lines;
	lines_t *output_lines;
	FILE *out;
	FILE *in_out;
	FILE *act_out;
	FILE *modelsim_out;
	FILE *in  = NULL;
	long num_vectors;

	double total_time; // Includes I/O
	double simulation_time; // Does not include I/O

	stages_t *stages;
	//maria
	thread_node_distribution *thread_distribution; //nodes distributed to threads for parallel calculations

	// Parse -L and -H options containing lists of pins to hold high or low during random vector generation.
	std::unordered_map<std::string,short> held_at;

	int num_waves;

	netlist_t *netlist;

};


void simulate_netlist(netlist_t *netlist);

/*these are called by simulate_netlist*/
sim_data_t *init_simulation(netlist_t *netlist);
sim_data_t *terminate_simulation(sim_data_t *sim_data);
int single_step(sim_data_t *sim_data, int wave);
void simulate_steps(sim_data_t *sim_data,double min_coverage);


nnode_t **get_children_of(nnode_t *node, int *count);
nnode_t **get_children_of_nodepin(nnode_t *node, int *num_children, int output_pin);

signed char get_pin_value(npin_t *pin, int cycle);

int get_clock_ratio(nnode_t *node);
void set_clock_ratio(int rat, nnode_t *node);



#endif

