[337] | 1 | # -*- coding: utf-8 -*-
|
---|
| 2 | #
|
---|
| 3 | # TECS Generator
|
---|
| 4 | # Generator for TOPPERS Embedded Component System
|
---|
| 5 | #
|
---|
[374] | 6 | # Copyright (C) 2008-2017 by TOPPERS Project
|
---|
[337] | 7 | #--
|
---|
| 8 | # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
| 9 | # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
| 10 | # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
| 11 | # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
| 12 | # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
| 13 | # スコード中に含まれていること.
|
---|
| 14 | # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
| 15 | # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
| 16 | # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
| 17 | # の無保証規定を掲載すること.
|
---|
| 18 | # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
| 19 | # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
| 20 | # と.
|
---|
| 21 | # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
| 22 | # 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
| 23 | # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
| 24 | # 報告すること.
|
---|
| 25 | # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
| 26 | # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
| 27 | # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
| 28 | # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
| 29 | # 免責すること.
|
---|
| 30 | #
|
---|
| 31 | # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
| 32 | # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
| 33 | # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
| 34 | # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
| 35 | # の責任を負わない.
|
---|
| 36 | #
|
---|
[359] | 37 | # $Id$
|
---|
[337] | 38 | #++
|
---|
| 39 |
|
---|
| 40 | # Regionクラスにメソッドを追加
|
---|
| 41 | =begin
|
---|
| 42 | class Region
|
---|
| 43 | def get_params
|
---|
| 44 | return @region_type_param
|
---|
| 45 | end
|
---|
| 46 |
|
---|
| 47 | def get_param
|
---|
| 48 | return @region_type_param[0]
|
---|
| 49 | end
|
---|
| 50 |
|
---|
| 51 | def is_root
|
---|
| 52 | return self == @@root_namespace
|
---|
| 53 | end
|
---|
| 54 | end
|
---|
| 55 | =end
|
---|
| 56 |
|
---|
| 57 | # Cellクラスにインスタンス変数とメソッドを追加
|
---|
| 58 | =begin
|
---|
| 59 | class Cell
|
---|
| 60 | def set_referenced_region( region )
|
---|
| 61 | if @referenced_regions.nil?
|
---|
| 62 | @referenced_regions = Array.new
|
---|
| 63 | end
|
---|
| 64 | if !@referenced_regions.include?(region)
|
---|
| 65 | @referenced_regions << region
|
---|
| 66 | end
|
---|
| 67 | end
|
---|
| 68 |
|
---|
| 69 | def get_referenced_regions
|
---|
| 70 | return @referenced_regions
|
---|
| 71 | end
|
---|
| 72 |
|
---|
| 73 | # set_referenced_cellにしたほうがよい
|
---|
| 74 | # def set_referenced_region( region, port_name )
|
---|
| 75 | def set_referenced_cell( cell, port_name )
|
---|
| 76 | if @referenced_cells.nil?
|
---|
| 77 | @referenced_cells = Hash.new
|
---|
| 78 | end
|
---|
| 79 | if !@referenced_cells.include?(port_name)
|
---|
| 80 | @referenced_cells[port_name] = Array.new
|
---|
| 81 | end
|
---|
| 82 | if !@referenced_cells[port_name].include?(cell)
|
---|
| 83 | @referenced_cells[port_name] << cell
|
---|
| 84 | end
|
---|
| 85 |
|
---|
| 86 | region = cell.get_region
|
---|
| 87 | puts "***** set_referenced_regions *****"
|
---|
| 88 | puts "region=#{region.get_name}, port=#{port_name}(#{port_name.class})"
|
---|
| 89 | if @referenced_regions.nil?
|
---|
| 90 | @referenced_regions = Hash.new
|
---|
| 91 | end
|
---|
| 92 | if !@referenced_regions.include?(port_name)
|
---|
| 93 | @referenced_regions[port_name] = Array.new
|
---|
| 94 | end
|
---|
| 95 | if !@referenced_regions[port_name].include?(region)
|
---|
| 96 | @referenced_regions[port_name] << region
|
---|
| 97 | end
|
---|
| 98 | puts "#{@referenced_regions[port_name]}"
|
---|
| 99 | end
|
---|
| 100 |
|
---|
| 101 | def get_referenced_cells( port_name )
|
---|
| 102 | if !@referenced_cells.nil? && @referenced_cells.include?(port_name)
|
---|
| 103 | return @referenced_cells[port_name]
|
---|
| 104 | else
|
---|
| 105 | return nil
|
---|
| 106 | end
|
---|
| 107 | end
|
---|
| 108 |
|
---|
| 109 | def get_referenced_regions( port_name )
|
---|
| 110 | if !@referenced_regions.nil? && @referenced_regions.include?(port_name)
|
---|
| 111 | return @referenced_regions[port_name]
|
---|
| 112 | else
|
---|
| 113 | return nil
|
---|
| 114 | end
|
---|
| 115 | end
|
---|
| 116 |
|
---|
| 117 | def self.get_cell_list
|
---|
| 118 | return @@cell_list
|
---|
| 119 | end
|
---|
| 120 |
|
---|
| 121 | def self.get_cell_list2
|
---|
| 122 | return @@cell_list2
|
---|
| 123 | end
|
---|
| 124 | end
|
---|
| 125 | =end
|
---|
| 126 |
|
---|
| 127 | #== celltype プラグインの共通の親クラス
|
---|
| 128 | class HRP2KernelObjectPlugin < CelltypePlugin
|
---|
| 129 | # @@obj_hash = {}
|
---|
| 130 |
|
---|
| 131 | #@celltype:: Celltype
|
---|
| 132 | #@option:: String :オプション文字列
|
---|
| 133 | def initialize( celltype, option )
|
---|
| 134 | super
|
---|
| 135 | # それぞれのカーネルオブジェクトを解析対象セルタイプに追加
|
---|
| 136 | HRP2KernelObjectPlugin.set_celltype(celltype)
|
---|
| 137 | end
|
---|
| 138 |
|
---|
| 139 | #=== HRP2KernelObjectPlugin#print_cfg_cre
|
---|
| 140 | # 各種カーネルオブジェクトのCRE_*の出力
|
---|
| 141 | # file:: FILE: 出力先ファイル
|
---|
| 142 | # val :: string: カーネルオブジェクトの属性の解析結果
|
---|
| 143 | # tab :: string: インデント用のtab
|
---|
| 144 | def print_cfg_cre(file, cell, val, tab)
|
---|
| 145 | raise "called virtual method print_cfg_cre in #{@celltype.get_name} plugin"
|
---|
| 146 | end
|
---|
| 147 |
|
---|
| 148 | #=== HRP2KernelObjectPlugin#print_cfg_sac
|
---|
| 149 | # 各種カーネルオブジェクトのSAC_*の出力
|
---|
| 150 | # file:: FILE: 出力先ファイル
|
---|
| 151 | # val :: string: カーネルオブジェクトの属性の解析結果
|
---|
| 152 | # acv :: string: アクセスベクタ
|
---|
| 153 | def print_cfg_sac(file, val, acv)
|
---|
| 154 | raise "called virtual method print_cfg_sac in #{@celltype.get_name} plugin"
|
---|
| 155 | end
|
---|
| 156 |
|
---|
| 157 | #=== HRP2KernelObjectPlugin#get_entry_ports_name_list
|
---|
| 158 | # カーネルオブジェクトの各種アクセスの種別の受け口名を取得
|
---|
| 159 | def get_entry_ports_name_list()
|
---|
| 160 | raise "called virtual method get_entry_ports_name_list in #{@celltype.get_name} plugin"
|
---|
| 161 | end
|
---|
| 162 |
|
---|
| 163 | def string_cfg_cre(cell, val)
|
---|
| 164 | raise "called virtual method string_cfg_cre in #{@celltype.get_name} plugin"
|
---|
| 165 | end
|
---|
| 166 |
|
---|
| 167 | def gen_factory file
|
---|
| 168 | puts "===== begin #{@celltype.get_name.to_s} plugin ====="
|
---|
| 169 |
|
---|
| 170 | # 対象となるすべてのセルについて、受け口に結合されている
|
---|
| 171 | # セルの所属ドメインを解析
|
---|
| 172 | if !HRP2KernelObjectPlugin.isChecked()
|
---|
| 173 | HRP2KernelObjectPlugin.check_referenced_cells()
|
---|
| 174 | else
|
---|
| 175 | puts "***** already checked"
|
---|
| 176 | end
|
---|
| 177 |
|
---|
| 178 | # 追記するために AppFile を使う(文字コード変換されない)
|
---|
| 179 | file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
|
---|
| 180 | file2.print "\n/* Generated by #{self.class.name} */\n\n"
|
---|
| 181 |
|
---|
| 182 | @celltype.get_cell_list.each { |cell|
|
---|
| 183 | if cell.is_generate?
|
---|
| 184 | puts "===== begin check my domain #{cell.get_name} ====="
|
---|
| 185 | # attrの値をハッシュに入れる
|
---|
| 186 | val = {}
|
---|
| 187 | @celltype.get_attribute_list.each{ |a|
|
---|
[374] | 188 | # p a.get_name
|
---|
[337] | 189 | if a.get_type.kind_of?( ArrayType )
|
---|
| 190 | val[a.get_name] = []
|
---|
| 191 | if j = cell.get_join_list.get_item(a.get_name)
|
---|
| 192 | # セル生成時に初期化する場合
|
---|
| 193 | j.get_rhs.each { |elem|
|
---|
| 194 | val[a.get_name] << elem.to_s
|
---|
| 195 | }
|
---|
| 196 | elsif i = a.get_initializer
|
---|
| 197 | # セルタイプの初期化値を使う場合
|
---|
| 198 | i.each { |elem|
|
---|
| 199 | val[a.get_name] << elem.to_s
|
---|
| 200 | }
|
---|
| 201 | else
|
---|
| 202 | raise "attribute is not initialized"
|
---|
| 203 | end
|
---|
| 204 | else
|
---|
| 205 | if j = cell.get_join_list.get_item(a.get_name)
|
---|
| 206 | # セル生成時に初期化する場合
|
---|
| 207 | val[a.get_name] = j.get_rhs.to_s
|
---|
| 208 | elsif i = a.get_initializer
|
---|
| 209 | # セルタイプの初期化値を使う場合
|
---|
| 210 | val[a.get_name] = i.to_s
|
---|
| 211 | else
|
---|
| 212 | raise "attribute is not initialized"
|
---|
| 213 | end
|
---|
| 214 | end
|
---|
| 215 | }
|
---|
| 216 | # generate.rbを参考に
|
---|
| 217 | # $id$を置換
|
---|
| 218 | if val[:id].nil? != true
|
---|
| 219 | puts val[:id]
|
---|
[374] | 220 | #val[:id] = val[:id].gsub( /(^|[^\$])\$id\$/, "\\1#{@celltype.get_name.to_s}_#{cell.get_name.to_s}" )
|
---|
| 221 | val[:id] = @celltype.subst_name( val[:id], @celltype.get_name_array( cell ) )
|
---|
[337] | 222 | end
|
---|
| 223 | # $cbp$の代わり
|
---|
| 224 | index = cell.get_id - @celltype.get_id_base
|
---|
| 225 | cell_CB_name = "#{@celltype.get_global_name}_CB_tab[#{index}]"
|
---|
| 226 | cell_domain_root = cell.get_region.get_domain_root
|
---|
| 227 | cell_domain_type = cell.get_region.get_domain_root.get_domain_type
|
---|
| 228 |
|
---|
| 229 | # CRE_XXX/DEF_XXXの生成
|
---|
| 230 | if cell_domain_type.get_option.to_s != "OutOfDomain"
|
---|
| 231 | # 保護ドメインに属する場合
|
---|
| 232 | if !HRP2KernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
|
---|
| 233 | # その保護ドメインの.cfgが生成されていない場合
|
---|
| 234 | HRP2KernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
|
---|
| 235 | puts "~~~~~ #{cell_domain_root.get_name.to_s} is registered!"
|
---|
| 236 |
|
---|
| 237 | # if cell.get_region.get_param == :KERNEL_DOMAIN
|
---|
| 238 | if cell_domain_type.get_option.to_s == "trusted"
|
---|
| 239 | # file2.print "#{cell.get_region.get_name.to_s}{\n"
|
---|
| 240 | file2.print "KERNEL_DOMAIN{\n"
|
---|
| 241 | else
|
---|
| 242 | file2.print "DOMAIN(#{cell_domain_root.get_name.to_s}){\n"
|
---|
| 243 | end
|
---|
| 244 | file2.puts "\tINCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");"
|
---|
| 245 | file2.puts "}\n"
|
---|
| 246 | else
|
---|
[374] | 247 | dbgPrint "~~~~~ #{cell.get_region.get_name.to_s} is included in"
|
---|
| 248 | # p @@region_list
|
---|
[337] | 249 | end
|
---|
| 250 | file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg" )
|
---|
| 251 | print_cfg_cre(file3, cell, val,"")
|
---|
| 252 | file3.close
|
---|
| 253 | else
|
---|
| 254 | # 無所属の場合
|
---|
| 255 | puts "~~~~~ #{cell_domain_root.get_name.to_s} is OutOfDomain"
|
---|
| 256 | print_cfg_cre(file2, cell, val, "")
|
---|
| 257 | end
|
---|
| 258 |
|
---|
| 259 | puts "===== end check my domain #{cell.get_name} ====="
|
---|
| 260 | # SAC_XXXの生成
|
---|
| 261 | if !val[:accessPattern].nil?
|
---|
| 262 | puts "===== begin check regions #{cell.get_name} ====="
|
---|
[374] | 263 | # p val[:accessPattern]
|
---|
| 264 | # p val[:accessPattern].class
|
---|
[337] | 265 |
|
---|
| 266 | #ep = [ :eTaskActivate, :eTaskControl, :eTaskManage, :eTaskRefer ]
|
---|
| 267 | #各カーネルオブジェクトの受け口名を取得
|
---|
| 268 | # ep = get_entry_ports_name_list()
|
---|
| 269 | i = 0
|
---|
| 270 | acv = []
|
---|
| 271 | # アクセス許可ベクタの生成
|
---|
| 272 | val[:accessPattern].each { |acptnx|
|
---|
| 273 | # アクセス許可パターンの生成
|
---|
| 274 | if acptnx != "OMIT"
|
---|
| 275 | acv << acptnx
|
---|
[374] | 276 | # p acv[i]
|
---|
[337] | 277 | elsif cell_domain_type.get_option.to_s == "trusted"
|
---|
| 278 | acv << "TACP_KERNEL"
|
---|
[374] | 279 | # p acv[i]
|
---|
[337] | 280 | elsif cell_domain_type.get_option.to_s != "OutOfDomain"
|
---|
| 281 | acv << "TACP(#{cell_domain_root.get_name.to_s})"
|
---|
| 282 | else
|
---|
| 283 | acv << "TACP_SHARED"
|
---|
| 284 | end
|
---|
| 285 |
|
---|
| 286 | i += 1
|
---|
| 287 | }
|
---|
| 288 |
|
---|
[374] | 289 | dbgPrint "acv = "
|
---|
[337] | 290 | p acv
|
---|
| 291 |
|
---|
| 292 | #各種SACの生成
|
---|
| 293 | domainOption = cell_domain_type.get_option
|
---|
| 294 | # if cell.get_region.get_region_type == :DOMAIN
|
---|
| 295 | if domainOption != "OutOfDomain"
|
---|
| 296 | # 保護ドメインに属する場合
|
---|
| 297 | file3 = AppFile.open( "#{$gen}/tecsgen_#{cell.get_region.get_name.to_s}.cfg" )
|
---|
| 298 | print_cfg_sac(file3, val, acv)
|
---|
| 299 | file3.close
|
---|
| 300 | else
|
---|
| 301 | # 無所属の場合
|
---|
| 302 | print_cfg_sac(file2, val, acv)
|
---|
| 303 | end
|
---|
| 304 |
|
---|
| 305 | puts "===== end check regions #{cell.get_name} ====="
|
---|
| 306 | end
|
---|
| 307 | end
|
---|
| 308 | }
|
---|
| 309 |
|
---|
| 310 | puts "===== end #{@celltype.get_name.to_s} plugin ====="
|
---|
| 311 | file2.close
|
---|
| 312 | end
|
---|
| 313 |
|
---|
| 314 | # カーネルオブジェクトセルタイプの管理
|
---|
| 315 | # HRP2KernelObjectPluginクラスに対してメソッド呼出しを行うことを想定
|
---|
| 316 | @@checked = false
|
---|
| 317 | @@celltype_list = []
|
---|
| 318 | @@region_list = []
|
---|
| 319 |
|
---|
| 320 | def self.isChecked()
|
---|
| 321 | return @@checked
|
---|
| 322 | end
|
---|
| 323 |
|
---|
| 324 | def self.check_referenced_cells()
|
---|
[374] | 325 | dbgPrint "===== begin check registered celltype =====\n"
|
---|
[337] | 326 | self.get_celltype_list.each { |ct|
|
---|
[374] | 327 | dbgPrint( ct.get_name.to_s + "\n" )
|
---|
[337] | 328 | }
|
---|
[374] | 329 | dbgPrint "===== end check registered celltype =====\n"
|
---|
[337] | 330 |
|
---|
| 331 | =begin
|
---|
| 332 | Cell.get_cell_list2.each { |cell|
|
---|
| 333 | cell.get_celltype.get_port_list.each{ |p|
|
---|
| 334 | next if p.get_port_type != :CALL
|
---|
| 335 | j = cell.get_join_list.get_item(p.get_name)
|
---|
| 336 | printf "===== check call port : "
|
---|
[374] | 337 | # p p.get_name.to_s
|
---|
[337] | 338 | next if j.nil? # 未結合の場合
|
---|
| 339 | if @@celltype_list.include?(j.get_celltype)
|
---|
| 340 | # j.get_cell.set_referenced_region(cell.get_region)
|
---|
| 341 | # j.get_cell.set_referenced_region(cell.get_region, j.get_port_name)
|
---|
| 342 | j.get_cell.set_referenced_cell(cell, j.get_port_name)
|
---|
| 343 | printf "===== check joined rhs cell : "
|
---|
[374] | 344 | # p j.get_cell.get_name.to_s
|
---|
[337] | 345 | printf "===== check joined rhs port_name : "
|
---|
[374] | 346 | # p j.get_port_name
|
---|
[337] | 347 | end
|
---|
| 348 | }
|
---|
| 349 | }
|
---|
| 350 | =end
|
---|
| 351 | @@checked = true
|
---|
| 352 | end
|
---|
| 353 |
|
---|
| 354 | def self.set_celltype( celltype )
|
---|
| 355 | @@celltype_list << celltype
|
---|
| 356 | end
|
---|
| 357 |
|
---|
| 358 | def self.get_celltype_list
|
---|
| 359 | return @@celltype_list
|
---|
| 360 | end
|
---|
| 361 |
|
---|
| 362 | def self.set_region_list( region )
|
---|
| 363 | @@region_list << region
|
---|
| 364 | end
|
---|
| 365 |
|
---|
| 366 | def self.include_region( region )
|
---|
| 367 | return @@region_list.include?(region)
|
---|
| 368 | end
|
---|
| 369 |
|
---|
| 370 | def self.include_celltype?( celltype )
|
---|
| 371 | return @@celltype_list.include?(celltype)
|
---|
| 372 | end
|
---|
| 373 |
|
---|
| 374 | end
|
---|
| 375 |
|
---|