end of line
[scilab.git] / scilab / modules / scicos / src / translator / translation / translator.ml
1 (*
2  *  Translator from Modelica 2.x to flat Modelica
3  *
4  *  Copyright (C) 2005 - 2007 Imagine S.A.
5  *  For more information or commercial use please contact us at www.amesim.com
6  *
7  *  This program is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU General Public License
9  *  as published by the Free Software Foundation; either version 2
10  *  of the License, or (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20  *
21  *)
22
23 (** Main module *)
24
25 (** {4 compiler options } *)
26
27 (** List of library files added using the "-lib" compiler option *)
28 let lib_files = ref []
29
30 let add_library_file s = lib_files := !lib_files @ [s]
31
32 (** Generation of and XML description of the instantiated model *)
33 let xml = ref false
34
35 (** option for the generation of initialization code *)
36 let init = ref false
37
38 (** option "-command" value *)
39 let command = ref None
40
41 let define_command s =
42   if !command <> None then failwith "More than one command issued."
43   else command := Some s
44
45 (** target file name, option "-o" *)
46 let filename = ref None
47
48 let define_filename s =
49   if !filename <> None then failwith "More than one target filename specified."
50   else filename := Some s
51
52 (** {4 functions } *)
53
54 (** Error displayed when the compiler is called with an invalid argument *)
55 let set_input s = failwith ("Invalid command line argument: " ^ s)
56
57 (** Parsing of compiler command line arguments *)
58 let parse_args () =
59   Arg.parse
60     [("-lib", Arg.String add_library_file,
61       "<filename> Define <filename> to be a file containing a Modelica \
62       library of classes.");
63      ("-o", Arg.String define_filename,
64       "<filename> Specify target filename (default is `<instance name>.mo`).");
65      ("-command", Arg.String define_command,
66       "\"command\" Define the component to be created as a regular Modelica \
67       component declaration.");
68      ("-xml", Arg.Set xml,
69       "Generate an XML version of the model instead of flat Modelica code");
70      ("-with-init", Arg.Set init,
71       "Generate an XML version of the initialization problem in a file \
72       named <filename>_init.xml.")]
73     set_input
74     (Printf.sprintf
75        "usage: %s [-lib <filename>] [-o <filename>] [-fundir <dirname>] \
76         -command \"command\""
77        Sys.argv.(0))
78
79 (** Compilation of libraries *)
80 let compile_libraries lib_paths =
81   try
82     let lib_syns = LibraryManager.parse_stored_libraries lib_paths in
83     let comp_defs' = NameResolve.resolve_toplevel [] lib_syns in
84     let inst_defs' =
85       Instantiation.evaluate_toplevel_definitions [] comp_defs' in
86     comp_defs', inst_defs'
87   with
88     exn ->
89       ExceptHandler.handle exn;
90       exit 1
91
92 (** Creation of components defined using the "-command" option argument *)
93 let create_component comp_defs inst_defs filename cmd =
94   try
95     let inst_syn = LibraryManager.parse_command cmd in
96     let comp_defs' = NameResolve.resolve_toplevel comp_defs [ inst_syn ] in
97     let inst_defs' =
98       Instantiation.evaluate_toplevel_definitions inst_defs comp_defs' in
99     CodeGeneration.generate_code !xml !init filename inst_defs'
100   with 
101     exn ->
102       ExceptHandler.handle exn;
103       exit 1
104
105 (** Main function *)
106 let run () =
107   Printf.printf "---------------------------------------------------\n";
108   Printf.printf "Translator v1.2 for Scicos from Modelica 2.x to flat Modelica\n";
109   Printf.printf "Copyright (C) \n2005-2007 Imagine,\n2007-2008 LMS-Imagine\n";
110   Versiondate.print_versiondate();
111   Printf.printf "---------------------------------------------------\n";
112   flush stderr;
113   flush stdout;
114   parse_args ();
115   let comp_defs, inst_defs =
116     compile_libraries !lib_files in
117   let cmd = match !command with
118     | None -> failwith "Command missing"
119     | Some cmd -> cmd in
120   create_component comp_defs inst_defs !filename cmd
121
122 ;;
123
124 run ()