/* 
 Test libarchfpga, try reading an architecture and print the results to a file

 Date: February 19, 2009
 Author: Jason Luu
 */

#include <stdio.h>
#include <stdlib.h>

#include "vtr_error.h"
#include "vtr_memory.h"

#include "read_xml_arch_file.h"
#include "echo_arch.h"

void print_help();

int main(int argc, char **argv) {
    try {
        t_arch* arch = (t_arch *) vtr::calloc(1,sizeof(t_arch));
        t_type_descriptor *types;
        int numTypes;

        if (argc - 1 != 3) {
            printf(
                    "Error: Unexpected # of arguments.  Expected 3 found %d arguments\n",
                    argc);
            print_help();
            return 1;
        }

        printf("------------------------------------------------------------------------------\n");
        printf("- Read architecture file and print library data structures into an output file\n");
        printf("------------------------------------------------------------------------------\n\n");

        printf("Inputs: \n"
                "architecture %s \n"
                "timing_driven %d \n"
                "output file %s\n", argv[1], atoi(argv[2]), argv[3]);
        printf("Reading in architecture\n");

        /* function declarations */
        XmlReadArch(argv[1], atoi(argv[2]), arch, &types, &numTypes);

        printf("Printing Results\n");

        EchoArch(argv[3], types, numTypes, arch);
        free(arch);
    } catch (vtr::VtrError& vtr_error) {
        printf("Failed to process architecture %s: %s\n", argv[1], vtr_error.what());
        return 1;
    }

    printf("Done\n");

	return 0;
}

void print_help() {
	printf("\n---------------------------------------------------------------------------------------\n");
	printf("read_arch - Read a VPR architecture file and output internal data structures\n");
	printf("\n");
	printf("Usage: read_arch <arch_file.xml> <timing_driven (0|1)> <output_file>\n");
	printf("\n");
	printf("  ex: read_arch k4_n10.xml 1 arch_data.out\n");
	printf("      Read timing-driven architecture k4_n10.xml and output the results to arch_data.out\n");
	printf("\n---------------------------------------------------------------------------------------\n");
}

