//---------------------------------------------------------------------------

#include <iostream>
#ifdef __BCPLUSPLUS__
#pragma hdrstop
#endif
#include "config.h"

#include <limits.h>
#include <map>

#ifdef HAVE_GETOPT
#include <unistd.h>
#else
#include "getopt.h"
#endif

#include "hub.h"
#include "bench_import.h"
#include "import.h"
#include "collapsing.h"
#include <time.h>
#include <process.h>


void doImport (Import* & importFunc) {
    try {
	(*importFunc) ();
    }
    catch ( std::runtime_error e ) { cerr << e.what() << "\n"; terminate(); }
    catch ( std :: logic_error e ) { cerr << e.what() << "\n"; terminate(); }
    delete importFunc;
    importFunc = NULL;
}

int main(int argc, char* argv[]) {

	if (argc == 1) {
		printf("\nCollapsing by Jaroslav Bartonik, version 1.0, 18.1.2008\n");
		printf("Nastroj pro prevedeni viceurovnoveho obvodu ve formatu BENCH do dvourovnove \nlogiky ve formatu PLA\n");
		printf("\n\tcollapsing vst_soubor vyst_soubor [esp_vysledek [esp_pocet]]\n");
		printf("\nPosledni dva nepovinne argumenty urcuji pouziti externiho programu Espresso pri minimalizaci obvodu (defaultne se nepouziva):\n");
		printf("   esp_vysledek - ci se ma pouzit Espresso na minimalizaci vyslednych vystupu\n      obvodu, muze nabyvat hodnot true nebo false, defaultne false\n");
		printf("   esp_pocet - od jakeho poctu soucinu se po prevedení kazdeho hradla ma\n      pouzit Espresso:\n");
		printf("        - pokud se nema pouzit, zada se hodnota -1 (defaultne)\n");
		printf("        - pro minimalizaci vsech hradel hodnota 1\n");
		printf("        - pro minimalizaci hradel s vice nez 2,3,4... souciny hodnota 2,3,4...\n");
		printf("\nPro pouziti minimalizace pomoci Espressa je treba mit program Espresso nahrany \nve stejnem adresari jako program collapsing.\n");
		return 0;
	}

	hub::Hub theHub;
    Import* importFunc = NULL;

	importFunc = new BenchImport (&theHub, argv[1]);
	if (importFunc) doImport (importFunc);

	printf("Nacteni souboru %s OK\n",argv[1]);//importFunc->fileName());
	Collapsing* col = new Collapsing(argc,argv);
	printf("Collapsing...\n");
	col->minimalize(theHub);

	return 0;
}