00001
00002
00003
00004
00005
00006
00007
00008 #ifndef lestes__backend_v2__workers__scheduler_g_hh__included
00009 #define lestes__backend_v2__workers__scheduler_g_hh__included
00010
00011 #include <lestes/std/list.hh>
00012 #include <lestes/std/set.hh>
00013 #include <lestes/std/map.hh>
00014 #include <lestes/backend_v2/common.hh>
00015 #include <lestes/backend_v2/workers/worker_base.g.hh>
00016
00017 #include <lestes/std/objectize_macros.hh>
00018 package(lestes);
00019 package(backend_v2);
00020 package(structs);
00021 class func_data;
00022 end_package(structs);
00023 end_package(backend_v2);
00024 end_package(lestes);
00025
00026 package(lestes);
00027 package(backend_v2);
00028 package(workers);
00029 class basic_block;
00030 end_package(workers);
00031 end_package(backend_v2);
00032 end_package(lestes);
00033
00034 package(lestes);
00035 package(backend_v2);
00036 package(intercode);
00037 class pi_pi;
00038 end_package(intercode);
00039 end_package(backend_v2);
00040 end_package(lestes);
00041
00042 package(lestes);
00043 package(backend_v2);
00044 package(intercode);
00045 class pi_sp;
00046 end_package(intercode);
00047 end_package(backend_v2);
00048 end_package(lestes);
00049
00050 package(lestes);
00051 package(backend_v2);
00052 package(intercode);
00053 class ge_pi;
00054 end_package(intercode);
00055 end_package(backend_v2);
00056 end_package(lestes);
00057
00058 package(lestes);
00059 package(backend_v2);
00060 package(workers);
00061
00062
00063 class scheduler;
00064 class schedule_item;
00065
00066
00067
00068 class scheduler : public worker_base {
00069 public:
00070
00071 bool dumb_scheduling_get() const;
00072
00073
00074 void dumb_scheduling_set(bool);
00075
00076
00077 ulint current_schedule_pos_get() const;
00078
00079
00080 void current_schedule_pos_set(ulint);
00081
00082
00083 ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_pi >, srp< schedule_item > > > ge2si_get() const;
00084
00085
00086 void ge2si_set(const ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_pi >, srp< schedule_item > > > & );
00087
00088 void process();
00089
00090 ptr< ::lestes::backend_v2::structs::func_data > get_result();
00091
00092 ptr<vector<srp< ::lestes::backend_v2::intercode::ge_pi> > > process_bb(ptr< ::lestes::backend_v2::workers::basic_block > bb);
00093
00094 ptr<set<srp< ::lestes::backend_v2::workers::schedule_item> > > find_schedule_items(ptr< ::lestes::backend_v2::workers::basic_block > bb);
00095
00096 void find_critical_paths(ptr<set<srp< ::lestes::backend_v2::workers::schedule_item> > > items);
00097
00098 ptr<vector<srp< ::lestes::backend_v2::intercode::ge_pi> > > schedule_items(ptr<set<srp<schedule_item> > > items);
00099
00100 ptr< schedule_item > create_schedule_item(ptr< ::lestes::backend_v2::intercode::ge_pi > ge);
00101
00102 void check_waiting_set(ptr<set<srp<schedule_item> > > waiting);
00103
00104 bool find_dependence_loop(ptr< schedule_item > start, ptr< schedule_item > curr, ulint depth);
00105
00106
00107
00108 static ptr< scheduler > create (
00109 ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data,
00110 bool a__scheduler__dumb_scheduling,
00111 ulint a__scheduler__current_schedule_pos,
00112 ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_pi >, srp< schedule_item > > > a__scheduler__ge2si);
00113
00114
00115 static ptr< scheduler > create (
00116 ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data);
00117
00118
00119
00120
00121 virtual ptr<reflection_list> reflection_get() const;
00122
00123 virtual ptr<field_list_list> field_values_get() const;
00124
00125 protected:
00126
00127 scheduler (
00128 ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data,
00129 bool a__scheduler__dumb_scheduling,
00130 ulint a__scheduler__current_schedule_pos,
00131 ptr< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_pi >, srp< schedule_item > > > a__scheduler__ge2si);
00132
00133
00134 virtual void gc_mark();
00135
00136 private:
00137
00138
00139
00140
00141 bool dumb_scheduling;
00142
00143 ulint current_schedule_pos;
00144
00145 srp< ::lestes::std::map< srp< ::lestes::backend_v2::intercode::ge_pi >, srp< schedule_item > > > ge2si;
00146 static ptr<reflection_list> reflection;
00147
00148 };
00149
00150
00151
00152 class schedule_item : public ::lestes::std::object {
00153 public:
00154
00155 ptr< ::lestes::backend_v2::intercode::ge_pi > instruction_get() const;
00156
00157
00158 void instruction_set(const ptr< ::lestes::backend_v2::intercode::ge_pi > &);
00159
00160
00161 ptr< ::lestes::std::set< srp< schedule_item > > > in_deps_get() const;
00162
00163
00164 void in_deps_set(const ptr< ::lestes::std::set< srp< schedule_item > > > & );
00165
00166
00167 ptr< ::lestes::std::set< srp< schedule_item > > > in_deps_copy_get() const;
00168
00169
00170 void in_deps_copy_set(const ptr< ::lestes::std::set< srp< schedule_item > > > & );
00171
00172
00173 ptr< ::lestes::std::set< srp< schedule_item > > > out_deps_get() const;
00174
00175
00176 void out_deps_set(const ptr< ::lestes::std::set< srp< schedule_item > > > & );
00177
00178
00179 ptr< ::lestes::std::set< srp< schedule_item > > > out_deps_copy_get() const;
00180
00181
00182 void out_deps_copy_set(const ptr< ::lestes::std::set< srp< schedule_item > > > & );
00183
00184
00185 ulint etime_get() const;
00186
00187
00188 void etime_set(ulint);
00189
00190
00191 ulint ctime_get() const;
00192
00193
00194 void ctime_set(ulint);
00195
00196
00197 ulint start_time_get() const;
00198
00199
00200 void start_time_set(ulint);
00201
00202
00203 ulint end_time_get() const;
00204
00205
00206 void end_time_set(ulint);
00207
00208
00209 ulint latest_start_time_get() const;
00210
00211
00212 void latest_start_time_set(ulint);
00213
00214
00215
00216 static ptr< schedule_item > create (
00217 ptr< ::lestes::backend_v2::intercode::ge_pi > a__schedule_item__instruction,
00218 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__in_deps,
00219 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__in_deps_copy,
00220 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__out_deps,
00221 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__out_deps_copy,
00222 ulint a__schedule_item__etime,
00223 ulint a__schedule_item__ctime,
00224 ulint a__schedule_item__start_time,
00225 ulint a__schedule_item__end_time,
00226 ulint a__schedule_item__latest_start_time);
00227
00228
00229 static ptr< schedule_item > create (
00230 ptr< ::lestes::backend_v2::intercode::ge_pi > a__schedule_item__instruction,
00231 ulint a__schedule_item__etime,
00232 ulint a__schedule_item__ctime);
00233
00234
00235
00236
00237 virtual ptr<reflection_list> reflection_get() const;
00238
00239 virtual ptr<field_list_list> field_values_get() const;
00240
00241 protected:
00242
00243 schedule_item (
00244 ptr< ::lestes::backend_v2::intercode::ge_pi > a__schedule_item__instruction,
00245 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__in_deps,
00246 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__in_deps_copy,
00247 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__out_deps,
00248 ptr< ::lestes::std::set< srp< schedule_item > > > a__schedule_item__out_deps_copy,
00249 ulint a__schedule_item__etime,
00250 ulint a__schedule_item__ctime,
00251 ulint a__schedule_item__start_time,
00252 ulint a__schedule_item__end_time,
00253 ulint a__schedule_item__latest_start_time);
00254
00255
00256 virtual void gc_mark();
00257
00258 private:
00259
00260 srp< ::lestes::backend_v2::intercode::ge_pi > instruction;
00261
00262 srp< ::lestes::std::set< srp< schedule_item > > > in_deps;
00263
00264 srp< ::lestes::std::set< srp< schedule_item > > > in_deps_copy;
00265
00266 srp< ::lestes::std::set< srp< schedule_item > > > out_deps;
00267
00268 srp< ::lestes::std::set< srp< schedule_item > > > out_deps_copy;
00269
00270 ulint etime;
00271
00272 ulint ctime;
00273
00274 ulint start_time;
00275
00276 ulint end_time;
00277
00278 ulint latest_start_time;
00279 static ptr<reflection_list> reflection;
00280
00281 };
00282
00283
00284 end_package(workers);
00285 end_package(backend_v2);
00286 end_package(lestes);
00287
00288 #endif // lestes__backend_v2__workers__scheduler_g_hh__included