Utility to dump TIDL networks to dot graphs
[tidl/tidl-api.git] / utils / main.cpp
1 /******************************************************************************
2  * Copyright (c) 2017-18, Texas Instruments Incorporated - http://www.ti.com/
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *      * Redistributions of source code must retain the above copyright
8  *        notice, this list of conditions and the following disclaimer.
9  *      * Redistributions in binary form must reproduce the above copyright
10  *        notice, this list of conditions and the following disclaimer in the
11  *        documentation and/or other materials provided with the distribution.
12  *      * Neither the name of Texas Instruments Incorporated nor the
13  *        names of its contributors may be used to endorse or promote products
14  *        derived from this software without specific prior written permission.
15  *
16  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26  *  THE POSSIBILITY OF SUCH DAMAGE.
27  *****************************************************************************/
28 #include <signal.h>
29 #include <getopt.h>
30 #include <iostream>
31 #include <iomanip>
32 #include <fstream>
33 #include <cassert>
34 #include <string>
36 #include "tinn_utils.h"
39 static void ProcessArgs(int argc, char *argv[], std::string& network_file,
40                         bool& do_print, std::string& dot_file);
42 static void DisplayHelp();
44 int main(int argc, char *argv[])
45 {
46     // Catch ctrl-c to ensure a clean exit
47     signal(SIGABRT, exit);
48     signal(SIGTERM, exit);
50     // Process arguments
51     std::string network_file;
52     std::string dot_file;
53     bool do_print = false;
54     ProcessArgs(argc, argv, network_file, do_print, dot_file);
56     bool status = true;
58     if (do_print)
59         status &= tinn::util::PrintNetwork(network_file);
61     if (!dot_file.empty())
62         status &= tinn::util::GenerateDotGraphForNetwork(network_file, dot_file);
64     if (!status)
65         return EXIT_FAILURE;
67     return EXIT_SUCCESS;
68 }
71 void ProcessArgs(int argc, char *argv[], std::string& network_file,
72                  bool& do_print, std::string& dot_file)
73 {
74     if (argc < 2)
75     {
76         DisplayHelp();
77         exit(EXIT_SUCCESS);
78     }
80     const struct option long_options[] =
81     {
82         {"help",         no_argument,       0, 'h'},
83         {"dot",          required_argument, 0, 'd'},
84         {"print",        no_argument,       0, 'p'},
85         {0, 0, 0, 0}
86     };
88     int option_index = 0;
90     while (true)
91     {
92         int this_option_optind = optind ? optind : 1;
93         int c = getopt_long(argc, argv, "-d:ph", long_options, &option_index);
95         if (c == -1)
96             break;
98         switch (c)
99         {
100             case 1:   network_file = argv[this_option_optind];
101                       break;
103             case 'd': dot_file = optarg;
104                       break;
106             case 'p': do_print = true;
107                       break;
109             case 'h': DisplayHelp();
110                       exit(EXIT_SUCCESS);
111                       break;
113             case '?': // Error in getopt_long
114                       exit(EXIT_FAILURE);
115                       break;
117             default:
118                       std::cerr << "Unsupported option: " << c << std::endl;
119                       break;
120         }
121     }
124 void DisplayHelp()
126     std::cout << "Usage: tinn_display [option] <Network binary file>\n"
127                  "Options:  \n"
128                  " -p              Print network layer info\n"
129                  " -d <file name>  Generate network graph (dot file)\n"
130                  " -h              Display this help message\n";