Class: HRPKernelObjectPlugin

Inherits:
CelltypePlugin show all
Defined in:
lib/tecsgen/plugin/HRPKernelObjectPlugin.rb

Overview

celltype プラグインの共通の親クラス

Direct Known Subclasses

HRPHandlerPlugin, HRPObjectPlugin, HRPTaskPlugin

Constant Summary collapse

@@checked =

カーネルオブジェクトセルタイプの管理 HRPKernelObjectPluginクラスに対してメソッド呼出しを行うことを想定

false
@@celltype_list =
[]
@@region_list =
[]

Constants inherited from Plugin

Plugin::PluginArgProc

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from CelltypePlugin

gen_post_code, #new_cell

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_cellsObject



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_listObject



318
319
320
# File 'lib/tecsgen/plugin/HRPKernelObjectPlugin.rb', line 318

def self.get_celltype_list
  return @@celltype_list
end

.include_celltype?(celltype) ⇒ Boolean

Returns:

  • (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

.isCheckedObject



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

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

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