#include <stdio.h>
#include <string.h>

#include "ace.h"
#include "blif.h"

bool blif_clock_from_latch(char * latch_line, char * clk_name) {
	char * pos;

	pos = strtok(latch_line, " ");
	pos = strtok(NULL, " ");
	pos = strtok(NULL, " ");
	pos = strtok(NULL, " ");
	pos = strtok(NULL, " ");

	if (pos) {
		strncpy(clk_name, pos, ACE_CHAR_BUFFER_SIZE);
		clk_name[ACE_CHAR_BUFFER_SIZE - 1] = '\0';
		return TRUE;
	} else {
		return FALSE;
	}
}

#if 0
void blif_clock_info(char * blif_file_name, int * num_clks, char * clk_name)
{
	bool multiple_clocks = FALSE;
	FILE * file_desc;
	char line[ACE_CHAR_BUFFER_SIZE];
	char clk_name_saved[ACE_CHAR_BUFFER_SIZE] = "";
	char clk_name_temp[ACE_CHAR_BUFFER_SIZE];

	char str_latch[] = ".latch";

	file_desc = fopen(blif_file_name, "r");
	while(fgets(line, ACE_CHAR_BUFFER_SIZE, file_desc))
	{
		char * start_pos = line;
		while (start_pos[0] == ' ' || start_pos[0] == '\t')
		{
			start_pos++;
		}

		// Check for .latch
		if ((start_pos == NULL) || (strncmp(start_pos, str_latch, 6) != 0))
		{
			continue;
		}

		// Extract and check clock name
		if (blif_clock_from_latch(line, clk_name_temp))
		{
			if (strcmp(clk_name_saved, "") == 0)
			{
				strcpy(clk_name_saved, clk_name_temp);
			}
			else if (strcmp(clk_name_saved, clk_name_temp))
			{
				multiple_clocks = TRUE;
				break;
			}
		}
	}

	if (multiple_clocks)
	{
		*num_clks = 2;
	}
	else if (strcmp(clk_name_saved, "") != 0)
	{
		*num_clks = 1;
		strcpy(clk_name, clk_name_saved);
	}
	else
	{
		*num_clks = 0;
	}
}
#endif
