Class: HRPKernelObjectPlugin
- Inherits:
-
CelltypePlugin
- Object
- Node
- Plugin
- CelltypePlugin
- HRPKernelObjectPlugin
- Defined in:
- lib/tecsgen/plugin/HRPKernelObjectPlugin.rb
Overview
celltype プラグインの共通の親クラス
Direct Known Subclasses
Constant Summary collapse
- @@checked =
カーネルオブジェクトセルタイプの管理 HRPKernelObjectPluginクラスに対してメソッド呼出しを行うことを想定
false
- @@celltype_list =
[]
- @@region_list =
[]
Constants inherited from Plugin
Class Method Summary collapse
- .check_referenced_cells ⇒ Object
- .get_celltype_list ⇒ Object
- .include_celltype?(celltype) ⇒ Boolean
- .include_region(region) ⇒ Object
- .isChecked ⇒ Object
- .set_celltype(celltype) ⇒ Object
- .set_region_list(region) ⇒ Object
Instance Method Summary collapse
-
#gen_factory(file) ⇒ Object
- セルタイププラグインの本体メソッド - 静的APIの生成 file
-
FILE: 出力先ファイル.
-
#initialize(celltype, option) ⇒ HRPKernelObjectPlugin
constructor
- @celltype
- Celltype @option
-
String :オプション文字列.
-
#print_cfg_cre(file, cell, val, tab) ⇒ Object
HRPKernelObjectPlugin#print_cfg_cre 各種カーネルオブジェクトのCRE_*の出力 file:: FILE: 出力先ファイル val :: string: カーネルオブジェクトの属性の解析結果 tab :: string: インデント用のtab.
-
#print_cfg_sac(file, val, acv) ⇒ Object
HRPKernelObjectPlugin#print_cfg_sac 各種カーネルオブジェクトのSAC_*の出力 file:: FILE: 出力先ファイル val :: string: カーネルオブジェクトの属性の解析結果 acv :: string: アクセスベクタ.
Methods inherited from CelltypePlugin
Methods inherited from Plugin
#cdl_error, #check_plugin_arg, #gen_cdl_file, #gen_ep_func?, #gen_postamble, #gen_preamble, #new_cell, #parse_plugin_arg, #print_msg, #set_locale, #set_silent
Methods inherited from Node
#cdl_error, #cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #locale_str, #set_locale
Constructor Details
#initialize(celltype, option) ⇒ HRPKernelObjectPlugin
- @celltype
-
Celltype
- @option
-
String :オプション文字列
46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 46 def initialize(celltype, option) super # # それぞれのカーネルオブジェクトを解析対象セルタイプに追加 # 目的: # - カーネルオブジェクトのセルをメモリ保護対象外とする # - カーネルオブジェクト本体の管理はTECSでなくOSで実施するため # - カーネルオブジェクトのセルへのアクセスを直接関数呼出し # とする # - システムサービス呼出しはOSが提供するため HRPKernelObjectPlugin.set_celltype(celltype) end |
Class Method Details
.check_referenced_cells ⇒ Object
304 305 306 307 308 309 310 311 312 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 304 def self.check_referenced_cells dbgPrint "===== begin check registered celltype =====\n" self.get_celltype_list.each {|ct| dbgPrint(ct.get_name.to_s + "\n") } dbgPrint "===== end check registered celltype =====\n" @@checked = true end |
.get_celltype_list ⇒ Object
318 319 320 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 318 def self.get_celltype_list return @@celltype_list end |
.include_celltype?(celltype) ⇒ Boolean
330 331 332 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 330 def self.include_celltype?(celltype) return @@celltype_list.include?(celltype) end |
.include_region(region) ⇒ Object
326 327 328 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 326 def self.include_region(region) return @@region_list.include?(region) end |
.isChecked ⇒ Object
300 301 302 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 300 def self.isChecked return @@checked end |
.set_celltype(celltype) ⇒ Object
314 315 316 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 314 def self.set_celltype(celltype) @@celltype_list << celltype end |
.set_region_list(region) ⇒ Object
322 323 324 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 322 def self.set_region_list(region) @@region_list << region end |
Instance Method Details
#gen_factory(file) ⇒ Object
セルタイププラグインの本体メソッド
- 静的APIの生成
file:: FILE: 出力先ファイル
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 82 def gen_factory(file) dbgPrint "===== begin #{@celltype.get_name} plugin =====\n" # # 対象となるすべてのセルについて、受け口に結合されている # セルの所属ドメインを解析 # - 生成すべきcfgファイル名を取得するために必要 # if !HRPKernelObjectPlugin.isChecked HRPKernelObjectPlugin.check_referenced_cells else dbgPrint "***** already checked\n" end # 追記するために AppFile を使う(文字コード変換されない) file2 = AppFile.open("#{$gen}/tecsgen.cfg") file2.print "\n/* Generated by #{self.class.name} */\n\n" @celltype.get_cell_list.each {|cell| if cell.is_generate? dbgPrint "===== begin check my domain #{cell.get_name} =====\n" # # カーネルオブジェクトの属性を,valにコピー # val = {} @celltype.get_attribute_list.each{|a| # p a.get_name if a.get_type.is_a?(ArrayType) val[a.get_name] = [] if j = cell.get_join_list.get_item(a.get_name) # セル生成時に初期化する場合 j.get_rhs.each {|elem| val[a.get_name] << elem.to_s } elsif i = a.get_initializer # セルタイプの初期化値を使う場合 i.each {|elem| val[a.get_name] << elem.to_s } else raise "attribute is not initialized" end else if j = cell.get_join_list.get_item(a.get_name) # セル生成時に初期化する場合 val[a.get_name] = j.get_rhs.to_s elsif i = a.get_initializer # セルタイプの初期化値を使う場合 val[a.get_name] = i.to_s else raise "attribute is not initialized" end end } # generate.rbを参考に # $id$を置換 if val[:id].nil? != true name_array = @celltype.get_name_array(cell) val[:id] = @celltype.subst_name(val[:id], name_array) end # $cbp$の代わり cell_domain_root = cell.get_region.get_domain_root cell_domain_type = cell.get_region.get_domain_root.get_domain_type # CRE_XXX/DEF_XXXの生成 if cell_domain_type.get_option.to_s != "OutOfDomain" # 保護ドメインに属する場合 if !HRPKernelObjectPlugin.include_region(cell_domain_root.get_name.to_s) # その保護ドメインの.cfgが生成されていない場合 HRPKernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s) dbgPrint "~~~~~ #{cell_domain_root.get_name} is registered!\n" # # if cell.get_region.get_param == :KERNEL_DOMAIN # if cell_domain_type.get_option.to_s == "kernel" # file2.print "KERNEL_DOMAIN{\n" # else # file2.print "DOMAIN(#{cell_domain_root.get_name.to_s}){\n" # end # file2.puts "\tINCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");" # file2.puts "}\n" else dbgPrint "~~~~~ #{cell.get_region.get_namespace_path} is included in" # p @@region_list end file3 = AppFile.open("#{$gen}/tecsgen_#{cell_domain_root.get_global_name}.cfg") print_cfg_cre(file3, cell, val, "") file3.close else # 無所属の場合 dbgPrint "~~~~~ #{cell_domain_root.get_namespace_path} is OutOfDomain\n" # print "~~~~~ #{cell_domain_root.get_namespace_path} is OutOfDomain\n" # p cell_domain_root.get_name if cell_domain_root.get_name == "::" print_cfg_cre(file2, cell, val, "") else # if !HRPKernelObjectPlugin.include_region(cell_domain_root.get_name.to_s) # # その保護ドメインの.cfgが生成されていない場合 # HRPKernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s) # file2.puts "INCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");\n" # end file3 = AppFile.open("#{$gen}/tecsgen_#{cell_domain_root.get_name}.cfg") print_cfg_cre(file3, cell, val, "") file3.close end end dbgPrint "===== end check my domain #{cell.get_name} =====\n" # # SAC_XXXの生成 # if !val[:accessPattern1].nil? dbgPrint "===== begin check regions #{cell.get_name} =====\n" i = 0 acv = { \ :accessPattern1 => val[:accessPattern1], \ :accessPattern2 => val[:accessPattern2], \ :accessPattern3 => val[:accessPattern3], \ :accessPattern4 => val[:accessPattern4] \ } acv_tmp = [] domain_roots = HRPPlugin.get_inter_domain_join_roots cell # 結合先セルのドメインを加える if cell_domain_type.get_kind != :OutOfDomain domain_roots << cell_domain_root end domain_roots.each{|dr| case dr.get_domain_type.get_kind when :user acv_tmp << "TACP(#{dr.get_name})" when :kernel acv_tmp << "TACP_KERNEL" when :OutOfDomain if cell_domain_type.get_kind == :OutOfDomain # 呼び元も、呼び先も OutOfDomain の場合 acv_tmp << "TACP_SHARED" end end } acv_tmp.uniq! if acv_tmp.length == 0 # 呼び先セルが無所属かつ、呼び元も無所属のみ、または結合無しの場合 acv_tmp = ["TACP_SHARED"] end b_info = false b_warn = false acv.each {|key, acp| if !acp.nil? if acp != "OMIT" elsif cell_domain_type.get_kind != :OutOfDomain # p "UserDomainCell or KernelDomainCell" domain_roots = HRPPlugin.get_inter_domain_join_roots cell domain_roots.each{|dr| # case dr.get_domain_type.get_kind when :kernel when :user if dr.get_namespace_path != cell.get_region.get_domain_root.get_namespace_path # 他のユーザードメインからの結合 if b_warn == false cdl_error("HRP9999 '$1': kernel object joined from other user domain. kernel object joined from multi-user-domain must be placed out of domain", cell.get_name) b_warn = true end end when :OutOfDomain if b_info == false # 無所属からの結合 # cdl_error( "HRP9999 kernel object joined from out of domain" ) if cell_domain_type.get_kind == :OutOfDomain # この情報は、不要と判断する (無所属から無所属へ結合があると、アクセス許可ベクタが設定されない) # cdl_info2( cell.get_locale, "HRP9999 '$1': kernel object joined from out of domain, access vector is not set", cell.get_name ) b_info = true end end else raise "unknown domain kind" end } # acv[key] = "TACP(#{cell_domain_root.get_name.to_s})" else # p "OutOfDomainCell" # 無所属のセル # 結合元ドメインに許可する # 結合元に無所属のセルがあると、TACP_SHARED が設定される. フロー解析してドメインを特定できるのが、あるべき仕様 end if acp == "OMIT" acv[key] = acv_tmp.join("|") end end } # 各種SACの生成 domainOption = cell_domain_type.get_option # p "domain_root ", cell.get_region.get_domain_root.get_name if domainOption != "OutOfDomain" || cell.get_region.get_domain_root.get_name != "::" # 保護ドメインに属する場合 file3 = AppFile.open("#{$gen}/tecsgen_#{cell.get_region.get_name}.cfg") print_cfg_sac(file3, val, acv) file3.close else # 無所属の場合 print_cfg_sac(file2, val, acv) end dbgPrint "===== end check regions #{cell.get_name} =====\n" end end } dbgPrint "===== end #{@celltype.get_name} plugin =====\n" file2.close end |
#print_cfg_cre(file, cell, val, tab) ⇒ Object
HRPKernelObjectPlugin#print_cfg_cre
各種カーネルオブジェクトのCRE_*の出力
- file
-
FILE: 出力先ファイル
- val
-
string: カーネルオブジェクトの属性の解析結果
- tab
-
string: インデント用のtab
64 65 66 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 64 def print_cfg_cre(file, cell, val, tab) raise "called virtual method print_cfg_cre in #{@celltype.get_name} plugin" end |
#print_cfg_sac(file, val, acv) ⇒ Object
HRPKernelObjectPlugin#print_cfg_sac
各種カーネルオブジェクトのSAC_*の出力
- file
-
FILE: 出力先ファイル
- val
-
string: カーネルオブジェクトの属性の解析結果
- acv
-
string: アクセスベクタ
73 74 75 |
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 73 def print_cfg_sac(file, val, acv) raise "called virtual method print_cfg_sac in #{@celltype.get_name} plugin" end |