2 * yosys -- Yosys Open SYnthesis Suite
4 * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include "kernel/yosys.h"
29 std::string pass_name
, short_help
;
30 Pass(std::string name
, std::string short_help
= "** document me **");
34 virtual void clear_flags();
35 virtual void execute(std::vector
<std::string
> args
, RTLIL::Design
*design
) = 0;
39 bool experimental_flag
= false;
42 experimental_flag
= true;
45 struct pre_post_exec_state_t
{
50 pre_post_exec_state_t
pre_execute();
51 void post_execute(pre_post_exec_state_t state
);
53 void cmd_log_args(const std::vector
<std::string
> &args
);
54 void cmd_error(const std::vector
<std::string
> &args
, size_t argidx
, std::string msg
);
55 void extra_args(std::vector
<std::string
> args
, size_t argidx
, RTLIL::Design
*design
, bool select
= true);
57 static void call(RTLIL::Design
*design
, std::string command
);
58 static void call(RTLIL::Design
*design
, std::vector
<std::string
> args
);
60 static void call_on_selection(RTLIL::Design
*design
, const RTLIL::Selection
&selection
, std::string command
);
61 static void call_on_selection(RTLIL::Design
*design
, const RTLIL::Selection
&selection
, std::vector
<std::string
> args
);
63 static void call_on_module(RTLIL::Design
*design
, RTLIL::Module
*module
, std::string command
);
64 static void call_on_module(RTLIL::Design
*design
, RTLIL::Module
*module
, std::vector
<std::string
> args
);
66 Pass
*next_queued_pass
;
67 virtual void run_register();
68 static void init_register();
69 static void done_register();
71 virtual void on_register();
72 virtual void on_shutdown();
75 struct ScriptPass
: Pass
77 bool block_active
, help_mode
;
78 RTLIL::Design
*active_design
;
79 std::string active_run_from
, active_run_to
;
81 ScriptPass(std::string name
, std::string short_help
= "** document me **") : Pass(name
, short_help
) { }
83 virtual void script() = 0;
85 bool check_label(std::string label
, std::string info
= std::string());
86 void run(std::string command
, std::string info
= std::string());
87 void run_script(RTLIL::Design
*design
, std::string run_from
= std::string(), std::string run_to
= std::string());
91 struct Frontend
: Pass
93 // for reading of here documents
94 static FILE *current_script_file
;
95 static std::string last_here_document
;
97 std::string frontend_name
;
98 Frontend(std::string name
, std::string short_help
= "** document me **");
99 void run_register() YS_OVERRIDE
;
100 ~Frontend() YS_OVERRIDE
;
101 void execute(std::vector
<std::string
> args
, RTLIL::Design
*design
) YS_OVERRIDE YS_FINAL
;
102 virtual void execute(std::istream
*&f
, std::string filename
, std::vector
<std::string
> args
, RTLIL::Design
*design
) = 0;
104 static std::vector
<std::string
> next_args
;
105 void extra_args(std::istream
*&f
, std::string
&filename
, std::vector
<std::string
> args
, size_t argidx
, bool bin_input
= false);
107 static void frontend_call(RTLIL::Design
*design
, std::istream
*f
, std::string filename
, std::string command
);
108 static void frontend_call(RTLIL::Design
*design
, std::istream
*f
, std::string filename
, std::vector
<std::string
> args
);
111 struct Backend
: Pass
113 std::string backend_name
;
114 Backend(std::string name
, std::string short_help
= "** document me **");
115 void run_register() YS_OVERRIDE
;
116 ~Backend() YS_OVERRIDE
;
117 void execute(std::vector
<std::string
> args
, RTLIL::Design
*design
) YS_OVERRIDE YS_FINAL
;
118 virtual void execute(std::ostream
*&f
, std::string filename
, std::vector
<std::string
> args
, RTLIL::Design
*design
) = 0;
120 void extra_args(std::ostream
*&f
, std::string
&filename
, std::vector
<std::string
> args
, size_t argidx
, bool bin_output
= false);
122 static void backend_call(RTLIL::Design
*design
, std::ostream
*f
, std::string filename
, std::string command
);
123 static void backend_call(RTLIL::Design
*design
, std::ostream
*f
, std::string filename
, std::vector
<std::string
> args
);
126 // implemented in passes/cmds/select.cc
127 extern void handle_extra_select_args(Pass
*pass
, std::vector
<std::string
> args
, size_t argidx
, size_t args_size
, RTLIL::Design
*design
);
128 extern RTLIL::Selection
eval_select_args(const vector
<string
> &args
, RTLIL::Design
*design
);
129 extern void eval_select_op(vector
<RTLIL::Selection
> &work
, const string
&op
, RTLIL::Design
*design
);
131 extern std::map
<std::string
, Pass
*> pass_register
;
132 extern std::map
<std::string
, Frontend
*> frontend_register
;
133 extern std::map
<std::string
, Backend
*> backend_register
;