- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/NotifierPlugin.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r270 r321 14 14 class NotifierPlugin < CelltypePlugin 15 15 16 # ---------- ã¢ããã¿é¢æ°ã®çæ-------------16 # ---------- アダプタ関数の生成 ------------- 17 17 # 18 # siHandlerBodyã®åãå£é¢æ°ã¯ï¼ã¿ã¤ã ã¤ãã³ãéç¥ã®éç¥å 19 ã¨ãã¦ç´æ¥æå®ãã 20 # ãã¨ã¯ã§ããªãï¼ã·ã°ããã£ãä¸è´ãã¦ããªããã¨ãçç±ã§ããï¼ãã®ããï¼ã¢ã 21 # ãã¿ã¨ãã¦åä½ããé¢æ°ãçæãï¼ã«ã¼ãã«ããã®å¼åºããTECSã®å¼åºãã«å¤æ㧠22 # ããããã«ããå¿ 23 è¦ãããï¼ 18 # siHandlerBodyの受け口関数は,タイムイベント通知の通知先として直接指定する 19 # ことはできない.シグネチャが一致していないことが理由である.このため,アダ 20 # プタとして動作する関数を生成し,カーネルからの呼出しをTECSの呼出しに変換で 21 # きるようにする必要がある. 24 22 # 25 # åºæ¬çã«ã¯ï¼åãå£æ¯ã«ã¢ããã¿é¢æ°ãçæããã°ååã§ããï¼ãããï¼ããã§ã¯ 26 # ã¡ã¢ãªæ¶è²»éãä¸å¿ 27 è¦ã«å¢å ãã¦ãã¾ãï¼ããã§ï¼éç¥å 28 é¢æ°ã«intptr_tåã®å¼æ° 29 # ã渡ãããã¨ã«çç®ãï¼é¢æ°ã®"ä¸è¬å"ãå³ãï¼ããªãã¡åãå£ã®ããå±æ§(ãã 30 # ã§ã¯ï¼çµåå 31 ã®ã»ã«ï¼æ·»åãªã©ãæã)ãï¼ã¢ããã¿é¢æ°ã®å¼æ°ã¨ãã¦åãåãã 32 # ããã«ãï¼1åã®ã¢ããã¿é¢æ°ã2å以ä¸ã®çµåã«å¯¾ãç¨ãããã¨ãã§ããããã« 33 # ããï¼ 23 # 基本的には,受け口毎にアダプタ関数を生成すれば十分である.しかし,これでは 24 # メモリ消費量が不必要に増加してしまう.そこで,通知先関数にintptr_t型の引数 25 # を渡せることに着目し,関数の"一般化"を図る.すなわち受け口のある属性(ここ 26 # では,結合先のセル,添字などを指す)を,アダプタ関数の引数として受け取れる 27 # ようにし,1個のアダプタ関数を2個以上の結合に対し用いることができるように 28 # する. 34 29 # 35 # ã¢ããã¿é¢æ°ã®å±æ§ã«ã¤ãã¦æ´çããã¨ï¼ 36 # - åãå£é¢æ° - ä¸è¬åãè¡ãã¨ï¼å®è¡æã³ã¹ãã大ããå¢å¤§ãã¦ãã¾ããã¨ã 37 # 確èªããã¦ããï¼ãã®ããï¼ä¸è¬åã¯è¡ããªãï¼EntryPropertyã«ãå«ããªãï¼ 38 # - ã»ã«ã¤ã³ããã¯ã¹ - CELLIDXåã§ï¼åã®è¦å®ã¯ãªããï¼"ãã¤ã³ã¿å¤ã§ãã£ãã 39 # æ´æ°å¤ã§ãã£ããããã" (TECS 5.3.6) ããï¼ã¤ã³ããã¯ã¹ããã¤ã³ã¿ãã 40 # ãã¨ãåããï¼ã¤ã³ããã¯ã¹ã ã¨ããã¨ï¼ãã®å¤ã¯ã»ã«CBã®ã¢ãã¬ãã·ã³ã°ã« 41 # 使ç¨ãããã®ã§ï¼intptr_tã«åã¾ãçã§ããï¼ãã¤ã³ã¿ã®å ´åï¼å½ç¶intptr_t 42 # ã«åã¾ãï¼ 43 # - åãå£é 44 åã®æ·»å - int_tï¼åæ§ã«intptr_tã«åã¾ãçã§ããï¼ 45 # ãããã®ãã¡ï¼ã»ã«ã¤ã³ããã¯ã¹ã¨åãå£é 46 åã®æ·»åã¯ãã©ã¡ã¼ã¿ã«å«ãããã¨ã 47 # ã§ãããã§ãããï¼ä¸¡æ¹ã¯ç¡çã§ããï¼ 48 # 両æ¹ãæ ¼ç´ããé 49 åãçæãï¼ãã®é 50 åã®è¦ç´ ã¸ã®ãã¤ã³ã¿ã渡ãããã«ããã¨ã 51 # ãé¸æè¢ãå¯è½ã§ãããï¼å®è¡é度ãåªå 52 ããããã«ï¼ãã®æ¹æ³ã¯ã¨ããªãã£ãï¼ 30 # アダプタ関数の属性について整理すると, 31 # - 受け口関数 - 一般化を行うと,実行時コストが大きく増大してしまうことが 32 # 確認されている.このため,一般化は行わない.EntryPropertyにも含めない. 33 # - セルインデックス - CELLIDX型で,型の規定はないが,"ポインタ値であったり 34 # 整数値であったりする。" (TECS 5.3.6) より,インデックスかポインタある 35 # ことが分かる.インデックスだとすると,この値はセルCBのアドレッシングに 36 # 使用されるので,intptr_tに収まる筈である.ポインタの場合,当然intptr_t 37 # に収まる. 38 # - 受け口配列の添字 - int_t.同様にintptr_tに収まる筈である. 39 # これらのうち,セルインデックスと受け口配列の添字はパラメータに含めることが 40 # できそうであるが,両方は無理である. 41 # 両方を格納した配列を生成し,その配列の要素へのポインタを渡すようにするとい 42 # う選択肢も可能であるが,実行速度を優先するために,この方法はとらなかった. 53 43 # 54 # ãã®ããï¼ä¸è¬åã¯ä»¥ä¸ã®ãã¿ã¼ã³ã«åé¡ãã¦è¡ãï¼44 # このため,一般化は以下のパターンに分類して行う. 55 45 # 56 # 1. ã»ã«ã¤ã³ããã¯ã¹ã®ã¿ä¸è¬åï¼ã»ã«ã¤ã³ããã¯ã¹ã®ãã¿ã¼ã³æ°ãåãå£é 57 åã® 58 # æ·»åã®ãã¿ã¼ã³æ°ããå¤ããï¼ãããã¯åãå£ãé 59 åã§ãªãå ´åã«è¡ãããï¼ 60 # 2. åãå£é 61 åã®æ·»åã®ã¿ä¸è¬åï¼ãã®å ´åï¼ã»ã«ãã¨ã«ç°ãªãé¢æ°ãç¨ããï¼ 46 # 1. セルインデックスのみ一般化.セルインデックスのパターン数が受け口配列の 47 # 添字のパターン数より多いか,あるいは受け口が配列でない場合に行われる. 48 # 2. 受け口配列の添字のみ一般化.この場合,セルごとに異なる関数を用いる. 62 49 # 63 # ããããï¼ååãå£é¢æ°ã«ã¤ãã¦ï¼ã¢ããã¿é¢æ°ã®çæåæ°ã¯ï¼64 # O(min{ ã»ã«ã¤ã³ããã¯ã¹ã®ãã¿ã¼ã³æ°, æ·»åã®ãã¿ã¼ã³æ°})65 # ã¨ãªãï¼50 # これより,各受け口関数について,アダプタ関数の生成個数は, 51 # O(min{セルインデックスのパターン数, 添字のパターン数}) 52 # となる. 66 53 # 67 # ãã©ã°ã¤ã³ã§ã®å¦çãã¯ã³ãã¹ã§è¡ãããã«ï¼tecsgen.cfgã§ã¯ã¢ããã¿é¢æ°ãç´68 # æ¥æå®ããã®ã§ã¯ãªãï¼ä»£ããã«ã¢ããã¿é¢æ°ã表ããã¯ãã使ç¨ããï¼ãã®69 # ãã¯ãã¯ã¢ããã¿é¢æ°ãã³ãã«ã¨å¼ã¶ãã¨ã«ããï¼70 # ã¢ããã¿é¢æ°ãã³ãã«ã¯ï¼æ¬¡ã®2åã®è¦ç´ ããæãï¼71 # - ã¢ããã¿é¢æ°ã¸ã®ã®ãã¤ã³ã¿72 # - ã¢ããã¿é¢æ°ã®å¼æ°54 # プラグインでの処理をワンパスで行うために,tecsgen.cfgではアダプタ関数を直 55 # 接指定するのではなく,代わりにアダプタ関数を表すマクロを使用する.この 56 # マクロはアダプタ関数ハンドルと呼ぶことにする. 57 # アダプタ関数ハンドルは,次の2個の要素から成る. 58 # - アダプタ関数へののポインタ 59 # - アダプタ関数の引数 73 60 74 61 # @private 75 62 class AdapterGenerator 76 63 77 # çµåå 78 ã«é¢ããå±æ§ãå«ãï¼ã»ã«ï¼åãå£é 79 åã®æ·»åããæãï¼ 80 # åä¸ã®EntryPropertyã¨ãªãçµåã¯ï¼å 81 ¨ãåãæ¹æ³ã§ãã®åãå£é¢æ°ãå¼ã³ 82 # åºããï¼ 64 # 結合先に関する属性を含む.セル,受け口配列の添字から成る. 65 # 同一のEntryPropertyとなる結合は,全く同じ方法でその受け口関数を呼び 66 # 出せる. 83 67 # @private 84 68 class EntryProperty 85 # @return [Cell] åãå£å´ã®ã»ã«ï¼69 # @return [Cell] 受け口側のセル. 86 70 attr_reader :cell 87 71 88 # @return [Integer, nil] åãå£é 89 åã®æ·»åï¼é 90 åã§ãªãå ´åã¯nilï¼ 72 # @return [Integer, nil] 受け口配列の添字.配列でない場合はnil. 91 73 attr_reader :subscript 92 74 … … 100 82 end 101 83 102 # åå¤æ§ã®å®ç¾©ï¼Hashã®ãã¼ã¨ãã¦ä½¿ç¨ããã®ã«å¿ 103 è¦ï¼ 84 # 同値性の定義.Hashのキーとして使用するのに必要. 104 85 def eql?(o) @cell == o.cell && @subscript == o.subscript end 105 86 def hash() @cell.hash ^ @subscript.hash end … … 108 89 # @private 109 90 class EntryPort 110 # @param [Port] port çµåå 111 ã®ã»ã«ã®ã»ã«ã¿ã¤ãã®åãå£ï¼ 91 # @param [Port] port 結合先のセルのセルタイプの受け口. 112 92 def initialize(port, prefix) 113 93 @port = port 114 94 @global_name = "#{prefix}_#{@port.get_celltype.get_global_name}_#{@port.get_name}" 115 95 116 # åãå£é¢æ°åï¼siHandlerBodyãæ³å®ãã¦ããã®ã§ï¼é¢æ°åã¯mainã§åºå®ã§ããï¼96 # 受け口関数名.siHandlerBodyを想定しているので,関数名はmainで固定である. 117 97 @entry_fn_name = "#{@port.get_celltype.get_global_name}_#{@port.get_name}_main" 118 98 … … 121 101 end 122 102 123 # @return [String] ã°ãã¼ãã«ã«ä¸æ(ãªãã®ã¨ãã¦æ±ãããã)ãªèå¥åï¼103 # @return [String] グローバルに一意(なものとして扱えるよう)な識別子. 124 104 attr_reader :global_name 125 105 … … 127 107 attr_reader :port 128 108 129 # æå®ããEntryPropertyã«å¯¾å¿ããã¢ããã¿é¢æ°ãã³ãã«ãåå¾ããï¼109 # 指定したEntryPropertyに対応するアダプタ関数ハンドルを取得する. 130 110 # @param [EntryProperty] ep 131 # @return [String] ã¢ããã¿é¢æ°ãã³ãã«ï¼111 # @return [String] アダプタ関数ハンドル. 132 112 # @private 133 113 def adapter_handle_for_entry_property(ep) … … 139 119 end 140 120 141 # çµåå 142 ã®æ 143 å ±ã«å¿ããã¢ããã¿é¢æ°ãã½ã¼ã¹ã»ãããã¼ã«åºåããï¼ 144 # ä¸è¬åæå®ã¯ï¼`cell`ã¾ãã¯`subscript`ã®ä¸æ¹ã®ã¿è¡ããã¨ãã§ããï¼ 121 # 結合先の情報に応じたアダプタ関数をソース・ヘッダーに出力する. 122 # 一般化指定は,`cell`または`subscript`の一方のみ行うことができる. 145 123 # 146 124 # @param [AdapterGenerator] context 147 # @param [String] fn_name é¢æ°åï¼148 # @param [Cell, Symbol] cell ã»ã«ï¼ã»ã«ã«ã¤ãã¦ä¸è¬åããå ´åã¯`:generic`149 # @param [Integer, Symbol, nil] subscript æ·»åï¼æ·»åã«ã¤ãã¦ä¸è¬åããå ´åã¯`:generic`125 # @param [String] fn_name 関数名. 126 # @param [Cell, Symbol] cell セル.セルについて一般化する場合は `:generic` 127 # @param [Integer, Symbol, nil] subscript 添字.添字について一般化する場合は `:generic` 150 128 # @private 151 129 def generate_inner(context, fn_name, cell, subscript) … … 158 136 ct = @port.get_celltype 159 137 160 # ã·ã³ã°ã«ãã³ã»ã«ã¿ã¤ã以å¤ã§ã¯ï¼CELLIDXã®æå®ãå¿ 161 è¦ï¼ 138 # シングルトンセルタイプ以外では,CELLIDXの指定が必要. 162 139 unless ct.is_singleton? 163 140 if cell == :generic 164 141 params << "(CELLIDX)extinf" 165 142 else 166 # ã»ã«ã®CELLIDXãå¾ã143 # セルのCELLIDXを得る 167 144 if ct.has_INIB? || ct.has_CB? 168 145 params << ct.get_name_array(cell)[7] … … 173 150 end 174 151 175 # åãå£é 176 åã®æ·»åï¼ 152 # 受け口配列の添字. 177 153 if @port.get_array_size 178 154 if subscript == :generic … … 192 168 end 193 169 194 # æå®ããJoinã«å¯¾å¿ããã¢ããã¿é¢æ°ãã³ãã«ãåå¾ããï¼195 # @return [Array] ã¢ããã¿é¢æ°ãã³ãã«ï¼170 # 指定したJoinに対応するアダプタ関数ハンドルを取得する. 171 # @return [Array] アダプタ関数ハンドル. 196 172 def make_adapter_handle(join) 197 173 prop = EntryProperty.from_join(join) … … 203 179 end 204 180 205 # ã½ã¼ã¹ã»ãããã¼ã®è¨è¿°ãçæããï¼181 # ソース・ヘッダーの記述を生成する. 206 182 # @param [AdapterGenerator] context 207 183 def generate(context) … … 217 193 no_cellidx = false 218 194 if !(ct.has_INIB? || ct.has_CB?) 219 # CB, INIB æé©åã«ããï¼CB, INIBã両æ¹ä¸è¦ã«ãªã£ãã±ã¼ã¹ï¼220 # CELLIDX ãä¸è¦ã§ããã®ã§ï¼ã»ã«ã«ã¤ãã¦ä¸è¬åãã¦ãæå³221 # ã¯ãªãã®ã§ï¼æ·»åã«ããä¸è¬åãé¸æããï¼195 # CB, INIB最適化により,CB, INIBが両方不要になったケース. 196 # CELLIDXが不要であるので,セルについて一般化しても意味 197 # はないので,添字による一般化を選択する. 222 198 generalize_by_cell_idx = false 223 199 no_cellidx = true 224 200 225 # å 226 ¨ã¦ã®ã»ã«ãåä¸è¦ããï¼ 201 # 全てのセルを同一視する. 227 202 cells = { @props[0].cell => @props } 228 203 229 204 header_file.print " * No INIB & CB: generalized by subscript\n" 230 205 elsif @port.get_array_size 231 # ä¸è¬åãã¿ã¼ã³ã®åé¡ãè¡ãããã«ï¼åãå£å´ã»ã«ãæ·»åã®232 # ãã¿ã¼ã³æ°ãåæãã¦ï¼æé©ãªæ¹ãé¸æããï¼206 # 一般化パターンの分類を行うために,受け口側セルや添字の 207 # パターン数を分析して,最適な方を選択する. 233 208 generalize_by_cell_idx = cells.length >= subscripts.length 234 209 if generalize_by_cell_idx … … 238 213 end 239 214 else 240 # 常ã«CELLIDXã§ä¸è¬å215 # 常にCELLIDXで一般化 241 216 generalize_by_cell_idx = true 242 217 header_file.print " * non-array entry port: generalized by cell\n" … … 246 221 247 222 if generalize_by_cell_idx 248 # CELLIDX ã«ã¤ãã¦ä¸è¬å223 # CELLIDXについて一般化 249 224 subscripts.each { |subscript, props| 250 225 if subscript 251 226 fn_name = "#{@global_name}_adap_#{subscript}" 252 227 else 253 # åãå£é 254 åã§ãªãå ´å 228 # 受け口配列でない場合 255 229 fn_name = "#{@global_name}_adap" 256 230 end … … 262 236 handle = adapter_handle_for_entry_property(prop) 263 237 264 # ã»ã«ã®CELLIDXãå¾ã238 # セルのCELLIDXを得る 265 239 if ct.has_INIB? || ct.has_CB? 266 240 idx = ct.get_name_array(prop.cell)[7] … … 273 247 } 274 248 else 275 # æ·»åã«ã¤ãã¦ä¸è¬å249 # 添字について一般化 276 250 cells.each { |cell, props| 277 251 if no_cellidx 278 # CB/INIB ãªã252 # CB/INIB なし 279 253 fn_name = "#{@global_name}_adap" 280 254 else … … 302 276 attr :header_file 303 277 304 # @param [String] celltype_name ãã³ãã©é¢æ°ã®ã»ã«ã¿ã¤ãï¼305 # @param [String] prefix ååè¡çªãé²ãããã®ãã¬ãã£ãã¯ã¹ï¼278 # @param [String] celltype_name ハンドラ関数のセルタイプ. 279 # @param [String] prefix 名前衝突を防ぐためのプレフィックス. 306 280 def initialize(celltype_name, prefix) 307 281 @celltype_name = celltype_name … … 313 287 314 288 # ===AdapterGenerator#make_adapter_handle=== 315 # æå®ããçµåã®å¼åºããè¡ãããã®ã¢ããã¿é¢æ°ãã³ãã«ãçæããï¼316 # @return [Array] ã¢ããã¿é¢æ°ãã³ãã«ï¼289 # 指定した結合の呼出しを行うためのアダプタ関数ハンドルを生成する. 290 # @return [Array] アダプタ関数ハンドル. 317 291 def make_adapter_handle(join) 318 292 entry_port = @entry_ports[join.get_rhs_port] … … 326 300 327 301 # ===AdapterGenerator#finish=== 328 # ååãå£ã«å¯¾ãï¼ã¢ããã¿é¢æ°ãçæããï¼302 # 各受け口に対し,アダプタ関数を生成する. 329 303 def finish 330 304 @source_file = AppFile.open( "#{$gen}/#{@celltype_name}.c" ) … … 336 310 @header_file.print "\n/* Generated by #{self.class.name} */\n\n" 337 311 338 # NotifierPlugin ã使ç¨ããã»ã«ã¿ã¤ããè¤æ°ããå ´åï¼ããããã«339 # 対ãAdapterGenerator#finishãå¼ã³åºãããï¼tTimeEventHandler.hã«340 # ç¶ãã¦æ¸ãè¾¼ãã§ãã¾ãã¨ï¼ãããã¼ã¬ã¼ãã®é¢ä¿ã§2åç®ä»¥éã®è¨è¿°341 # ãèªã¿è¾¼ã¾ããªããªã£ã¦ãã¾ãï¼ãã®ããï¼ãã¡ã¤ã«å + ã»ã«ã¿ã¤ãå342 # ã¨ããå°ãç¹æ®ãªãããã¼ã¬ã¼ããç¨ããï¼312 # NotifierPluginを使用するセルタイプが複数ある場合,それぞれに 313 # 対しAdapterGenerator#finishが呼び出される.tTimeEventHandler.hに 314 # 続けて書き込んでしまうと,ヘッダーガードの関係で2回目以降の記述 315 # が読み込まれなくなってしまう.このため,ファイル名 + セルタイプ名 316 # という少し特殊なヘッダーガードを用いる. 343 317 header_guard = "#{@celltype_name}_H_#{@prefix}" 344 318 … … 346 320 @header_file.print "\#define #{header_guard}\n\n" 347 321 348 # ã«ã¼ãã«ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãå®è¡ããéï¼ãã³ãã©åãå£ã®ã»ã«ã¿ã¤ã 349 # ã®ã»ã«CBã®å®ç¾©ãå¿ 350 è¦ãªå ´åãããï¼ 322 # カーネルコンフィギュレータを実行する際,ハンドラ受け口のセルタイプ 323 # のセルCBの定義が必要な場合がある. 351 324 @header_file.print "\#include \"#{@celltype_name}_aux.h\"\n\n" 352 325 353 # çµåå 354 ã®ã»ã«ã¿ã¤ãã®å®ç¾©ã¯ï¼èªåã®ã»ã«ã®tecsgen.hãããå 355 ã« 356 # èªã¿è¾¼ã¾ãªããã°ãªããªããï¼ãã®ãã©ã°ã¤ã³ãè¤æ°å®è¡ãããã¨ï¼ 357 # é åºãå´©ãã¦ãã¾ãï¼ããã§ï¼çµåå 358 ã®ã»ã«ã¿ã¤ãã®å®ç¾©ã¯ããä¸ã¤ã® 359 # ãããã¼ãã¡ã¤ã«(tCelltypeName_aux.h)ããèªã¿è¾¼ãããã«ããï¼ 326 # 結合先のセルタイプの定義は,自分のセルのtecsgen.hよりも先に 327 # 読み込まなければならないが,このプラグインが複数実行されると, 328 # 順序が崩れてしまう.そこで,結合先のセルタイプの定義はもう一つの 329 # ヘッダーファイル(tCelltypeName_aux.h)から読み込むようにする. 360 330 aux_header_file = AppFile.open( "#{$gen}/#{@celltype_name}_aux.h" ) 361 331 aux_header_file.print "\n/* Generated by #{self.class.name} */\n\n" … … 368 338 cb_type_only_guard = "#{@celltype_name}_AUX_H_#{@prefix}_CB_TYPE_ONLY" 369 339 370 # çµåå 371 ã®ã»ã«ã¿ã¤ãã®å®ç¾©ãèªã¿è¾¼ã 340 # 結合先のセルタイプの定義を読み込む 372 341 aux_header_file.print "#ifndef TOPPERS_CB_TYPE_ONLY\n" 373 342 aux_header_file.print "#define TOPPERS_CB_TYPE_ONLY\n" … … 400 369 end 401 370 402 # ------ éç¥ã®ãã³ãã©ã®ç¨®é¡ã®å®ç¾©-------371 # ------ 通知のハンドラの種類の定義 ------- 403 372 404 373 class Handler … … 410 379 end 411 380 412 # é常ã®ãã³ãã©381 # 通常のハンドラ 413 382 EVENT_HANDLER = Handler::new("ciNotificationHandler") 414 383 415 # ã¨ã©ã¼ãã³ãã© (é常ã®ãã³ãã©ã失æããå ´åã«å¼ã³åºããã)384 # エラーハンドラ (通常のハンドラが失敗した場合に呼び出される) 416 385 ERROR_HANDLER = Handler::new("ciErrorNotificationHandler") 417 386 … … 436 405 end 437 406 438 # ------ éç¥ã®å±æ§ã®å®ç¾©-------407 # ------ 通知の属性の定義 ------- 439 408 # 440 # ãã³ãã©ã¿ã¤ãã«åè´ããªãå±æ§ãæå®ãããå ´åã« 441 # ã¨ã©ã¼ãåºåã§ãããããå 442 ¨ã¦ã®å±æ§ãããã§åæããã 409 # ハンドラタイプに合致しない属性が指定された場合に 410 # エラーを出力できるよう、全ての属性をここで列挙する。 443 411 444 412 SETVAR_ADDR_ATTR = HandlerAttribute::new("setVariableAddress") … … 456 424 ] 457 425 458 # ------ ãã³ãã©ã¿ã¤ãã®å®ç¾©-------426 # ------ ハンドラタイプの定義 ------- 459 427 460 428 class BaseHandlerType … … 470 438 471 439 #=== NotifierPlugin#BaseHandlerType#validate_join 472 # æå®ããã»ã«ã®çµåå 473 ãããã®ãã³ãã©ã¿ã¤ãã«è©²å½ããããæ¤è¨¼ 474 # handler:: Handler : ãã³ãã© 475 # cell:: Cell : ã»ã« 476 # join:: Join : çµå (declarationãPortã§ãããã®) 440 # 指定したセルの結合先が、このハンドラタイプに該当するかを検証 441 # handler:: Handler : ハンドラ 442 # cell:: Cell : セル 443 # join:: Join : 結合 (declarationがPortであるもの) 477 444 def validate_join(handler, cell, join) 478 445 return !generate_attr_map(handler, cell).nil? … … 480 447 481 448 #=== NotifierPlugin#BaseHandlerType#generate_attr_map 482 # æå®ããã»ã«ã®å±æ§ã¨ãæ¢ç¥ã®HandlerAttributeã®ãããã³ã°ã483 # çæããHash<HandlerAttribute, Join> (åå±æ§ã¨ããã«å¯¾å¿ãã484 # Join(declaration ãDeclã®ãã®)ã表ãHash)ããããã¯ã485 # ãããã³ã°ãè¡ããªãå ´å(å±æ§ã®ä¸è¶³ãéå°)ã¯nilãè¿ãã449 # 指定したセルの属性と、既知のHandlerAttributeのマッピングを 450 # 生成し、Hash<HandlerAttribute, Join> (各属性とそれに対応する 451 # Join(declarationがDeclのもの)を表すHash)、あるいは、 452 # マッピングが行えない場合(属性の不足、過剰)はnilを返す。 486 453 # 487 # handler:: Handler : ãã³ãã©488 # cell:: Cell : ã»ã«454 # handler:: Handler : ハンドラ 455 # cell:: Cell : セル 489 456 def generate_attr_map(handler, cell) 490 457 map = {} … … 496 463 join = join_list.get_item(attr_name.to_sym) 497 464 498 # ãã®ã»ã«ã¿ã¤ãã«ããã¦å¿ 499 é ã®å±æ§ã? 465 # このセルタイプにおいて必須の属性か? 500 466 is_required = @required_attributes.include?(known_attr) 501 467 502 # å±æ§ã®æå®ãä¸è¶³ãã¦ãã? or éå°? 503 # 注: ãã³ãã©ã¿ã¤ãã®å¤å¥ã«ã¯ãã»ã«ã§å¤ãæå®ããã¦ããã 504 # ãèæ 505 ®ããããã»ã«ã¿ã¤ãã§åæå¤ãæå®ããã¦ãã¦ãã 506 # ããã¯ãã³ãã©ã¿ã¤ãã®æ±ºå®ã«å½±é¿ããªãã 468 # 属性の指定が不足している? or 過剰? 469 # 注: ハンドラタイプの判別には、セルで値が指定されているか 470 # が考慮される。セルタイプで初期値が指定されていても、 471 # それはハンドラタイプの決定に影響しない。 507 472 return nil if join.nil? != !is_required 508 473 509 # å¿ 510 è¦ã®ãªãå±æ§ã§ãããæå®ãããã¦ããªãã®ã§é£ã°ã 474 # 必要のない属性であり、指定もされていないので飛ばす 511 475 next if join.nil? 512 476 513 # TODO: attr ã®çµåã§ãããã¨ãæ¤è¨¼477 # TODO: attrの結合であることを検証 514 478 515 479 map[known_attr] = join … … 520 484 521 485 #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_type 522 # ã¿ã¤ã ã¤ãã³ãã®éç¥ã®ç¨®é¡ã表ãã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®è¨è¿°ãçæããStringã¾ãã¯nilãè¿ã523 # handler:: Handler : ãã³ãã©486 # タイムイベントの通知の種類を表すコンフィギュレータの記述を生成し、Stringまたはnilを返す 487 # handler:: Handler : ハンドラ 524 488 def gen_cfg_handler_type(handler) 525 489 raise "called abstract method gen_cfg_handler_type" … … 527 491 528 492 #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_parameters 529 # ã¿ã¤ã ã¤ãã³ãã®éç¥ã®å¼æ°ã表ãã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®è¨è¿°ãçæããString[]ãè¿ã530 # handler:: Handler : ãã³ãã©531 # join:: Join : çµå (declarationãPortã§ãããã®)493 # タイムイベントの通知の引数を表すコンフィギュレータの記述を生成し、String[]を返す 494 # handler:: Handler : ハンドラ 495 # join:: Join : 結合 (declarationがPortであるもの) 532 496 # attrMap:: Hash<HandlerAttribute, Join> : 533 # åå±æ§ã¨ããã«å¯¾å¿ããJoin (declarationãDeclã®ãã®)534 # cell:: Cell : ã»ã«535 # adpt_gen:: AdapterGenerator : ã¢ããã¿é¢æ°ãçæãããªãã¸ã§ã¯ã497 # 各属性とそれに対応するJoin (declarationがDeclのもの) 498 # cell:: Cell : セル 499 # adpt_gen:: AdapterGenerator : アダプタ関数を生成するオブジェクト 536 500 def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen) 537 501 return nil … … 539 503 540 504 #=== NotifierPlugin#BaseHandlerType#might_fail 541 # éç¥ã®éãã¨ã©ã¼ãçºçãããã®çµæã¨ã©ã¼éç¥ãå¼ã¶å¿ 542 è¦ãçãã 543 # ãã©ãããè¿ãã 505 # 通知の際、エラーが発生し、その結果エラー通知を呼ぶ必要が生じる 506 # かどうかを返す。 544 507 def might_fail 545 508 return false … … 557 520 id_attr = join.get_rhs_cell.get_celltype.find(:id) 558 521 if id_attr_join 559 # ã»ã«çææã«åæåããå ´å522 # セル生成時に初期化する場合 560 523 id = id_attr_join.get_rhs.to_s 561 524 else 562 # ã»ã«ã¿ã¤ãã®åæåå¤ã使ãå ´å525 # セルタイプの初期化値を使う場合 563 526 id = id_attr.get_initializer.to_s 564 527 end 565 528 566 # $id$ çã®ç½®æ529 # $id$等の置換 567 530 name_array = taskCell.get_celltype.get_name_array(taskCell) 568 531 id = taskCell.get_celltype.subst_name(id, name_array) … … 617 580 var_value = attrMap[SETVAR_VALUE_ATTR].get_rhs.to_s 618 581 619 # $id$ çã®ç½®æ582 # $id$等の置換 620 583 name_array = cell.get_celltype.get_name_array(cell) 621 584 var_addr = cell.get_celltype.subst_name(var_addr, name_array) … … 646 609 var_addr = attrMap[SETVAR_ADDR_ATTR].get_rhs.to_s 647 610 648 # $id$ çã®ç½®æ611 # $id$等の置換 649 612 name_array = cell.get_celltype.get_name_array(cell) 650 613 var_addr = cell.get_celltype.subst_name(var_addr, name_array) … … 673 636 var_addr = attrMap[INCVAR_ADDR_ATTR].get_rhs.to_s 674 637 675 # $id$ çã®ç½®æ638 # $id$等の置換 676 639 name_array = cell.get_celltype.get_name_array(cell) 677 640 var_addr = cell.get_celltype.subst_name(var_addr, name_array) … … 697 660 id_attr = join.get_rhs_cell.get_celltype.find(:id) 698 661 if id_attr_join 699 # ã»ã«çææã«åæåããå ´å662 # セル生成時に初期化する場合 700 663 id = id_attr_join.get_rhs.to_s 701 664 else 702 # ã»ã«ã¿ã¤ãã®åæåå¤ã使ãå ´å665 # セルタイプの初期化値を使う場合 703 666 id = id_attr.get_initializer.to_s 704 667 end 705 668 706 # $id$ çã®ç½®æ669 # $id$等の置換 707 670 name_array = semaphoreCell.get_celltype.get_name_array(semaphoreCell) 708 671 id = semaphoreCell.get_celltype.subst_name(id, name_array) … … 737 700 id_attr = join.get_rhs_cell.get_celltype.find(:id) 738 701 if id_attr_join 739 # ã»ã«çææã«åæåããå ´å702 # セル生成時に初期化する場合 740 703 id = id_attr_join.get_rhs.to_s 741 704 else 742 # ã»ã«ã¿ã¤ãã®åæåå¤ã使ãå ´å705 # セルタイプの初期化値を使う場合 743 706 id = id_attr.get_initializer.to_s 744 707 end 745 708 flg_pattern = attrMap[SETFLG_FLAG_ATTR].get_rhs.to_s 746 709 747 # $id$ çã®ç½®æ710 # $id$等の置換 748 711 name_array = eventflagCell.get_celltype.get_name_array(eventflagCell) 749 712 id = eventflagCell.get_celltype.subst_name(id, name_array) … … 778 741 id_attr = join.get_rhs_cell.get_celltype.find(:id) 779 742 if id_attr_join 780 # ã»ã«çææã«åæåããå ´å743 # セル生成時に初期化する場合 781 744 id = id_attr_join.get_rhs.to_s 782 745 else 783 # ã»ã«ã¿ã¤ãã®åæåå¤ã使ãå ´å746 # セルタイプの初期化値を使う場合 784 747 id = id_attr.get_initializer.to_s 785 748 end 786 749 787 # $id$ çã®ç½®æ750 # $id$等の置換 788 751 name_array = dataqueueCell.get_celltype.get_name_array(dataqueueCell) 789 752 id = dataqueueCell.get_celltype.subst_name(id, name_array) … … 812 775 sent_value = attrMap[SNDDTQ_VALUE_ATTR].get_rhs.to_s 813 776 814 # $id$ çã®ç½®æ777 # $id$等の置換 815 778 name_array = cell.get_celltype.get_name_array(cell) 816 779 sent_value = cell.get_celltype.subst_name(sent_value, name_array) … … 854 817 end 855 818 def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen) 856 # tTimeEventHandlerã®çµåå 857 ãåå¾ 819 # tTimeEventHandlerの結合先を取得 858 820 handler_cell = join.get_rhs_cell 859 821 call_join = handler_cell.get_join_list.get_item(:ciHandlerBody) 860 822 861 # çµåããã¦ããªãå ´åã¯tecsgenãã¨ã©ã¼ãåºãã¯ããªã®ã§ããã§ã¯862 # ã¨ã©ã¼ã«ããç¡è¦ããï¼823 # 結合されていない場合はtecsgenがエラーを出すはずなのでここでは 824 # エラーにせず無視する. 863 825 return [] unless call_join 864 826 865 # ã¢ããã¿é¢æ°ãã³ãã«ãåå¾827 # アダプタ関数ハンドルを取得 866 828 adapter_handle = adpt_gen.make_adapter_handle(call_join) 867 829 return [adapter_handle[1], adapter_handle[0]] … … 897 859 898 860 #@celltype:: Celltype 899 #@option:: String : ãªãã·ã§ã³æåå861 #@option:: String :オプション文字列 900 862 def initialize( celltype, option ) 901 863 super 902 864 @plugin_arg_check_proc_tab = NotifierPluginArgProc 903 865 @plugin_arg_str = option 904 @plugin_arg_str = option.gsub( /\A"(.*)/, '\1' ) # åå¾ã® "" ãåãé¤ã866 @plugin_arg_str = option.gsub( /\A"(.*)/, '\1' ) # 前後の "" を取り除く 905 867 @plugin_arg_str.sub!( /(.*)"\z/, '\1' ) 906 868 @factory = nil … … 940 902 kernelCfg.print "\#include \"tTimeEventHandler.h\"\n" 941 903 942 # ã¢ããã¿é¢æ°ãçæããæºå904 # アダプタ関数を生成する準備 943 905 @adpt_gen = AdapterGenerator.new("tTimeEventHandler", @celltype.get_global_name) 944 906 945 # å±æ§ç½®æãè¡ãããã¨ãæ¤è¨¼ããã946 # ããã§è¡ãã®ã¯ãfactoryã§æå®ãããå±æ§åã947 # åå¨ãããã¨ã確èªããããªããã°ã¨ã©ã¼ãåºåãããã¨ã®ã¿ã§ããã948 # ã»ã«ãã¨ã®å¦çã®æä¸ã«ã¨ã©ã¼ãåºåãããã¨ãå¯è½ã§ã¯ãããã949 # ããããã¨ã»ã«ã¿ã¤ãå´ã®åé¡ã§ããã®ã«ãããããããã»ã«ãã¨ã«950 # ã¨ã©ã¼ã表示ããã¦ãã¾ãã907 # 属性置換が行えることを検証する。 908 # ここで行うのは、factoryで指定された属性名が 909 # 存在することを確認し、しなければエラーを出力することのみである。 910 # セルごとの処理の最中にエラーを出力することも可能ではあるが、 911 # そうするとセルタイプ側の問題であるのにもかかわらず、セルごとに 912 # エラーが表示されてしまう。 951 913 # {{attribute_name}} -> attribute_value 952 914 @factory.scan(/\{\{([a-zA-Z0-9_]*?)\}\}/) { |match| 953 915 name = $1.to_sym 954 916 955 # {{_handler_params_}} ã¯ãã³ãã©ã«é¢ããæå®ããã©ã°ã¤ã³å 956 ã§å¤ãçæããã 917 # {{_handler_params_}} はハンドラに関する指定。プラグイン内で値が生成される 957 918 next if name == :_handler_params_ 958 919 … … 968 929 } 969 930 970 # ã¢ããã¿é¢æ°ã®çæãå®äºããã931 # アダプタ関数の生成を完了させる 971 932 @adpt_gen.finish 972 933 … … 982 943 handler_flag = nil 983 944 984 # ignoreErrors ãåå¾945 # ignoreErrorsを取得 985 946 ignoreErrors_attr_join = cell.get_join_list.get_item(:ignoreErrors) 986 947 ignoreErrors_attr = cell.get_celltype.find(:ignoreErrors) 987 948 if ignoreErrors_attr_join 988 # ã»ã«çææã«åæåããå ´å949 # セル生成時に初期化する場合 989 950 ignoreErrors = ignoreErrors_attr_join.get_rhs.to_s 990 951 else 991 # ã»ã«ã¿ã¤ãã®åæåå¤ã使ãå ´å952 # セルタイプの初期化値を使う場合 992 953 ignoreErrors = ignoreErrors_attr.get_initializer.to_s 993 954 end … … 1002 963 1003 964 [EVENT_HANDLER, ERROR_HANDLER].each { |handler| 1004 # å¼ã³å£ã®çµåãåå¾965 # 呼び口の結合を取得 1005 966 call_join = cell.get_join_list.get_item(handler.call_port_name.to_sym) 1006 967 1007 # ãã³ãã©ã¿ã¤ããå¤å¥ãã968 # ハンドラタイプを判別する 1008 969 matches = HANDLER_TYPES.select { |handler_type| 1009 970 handler_type.validate_join(handler, cell, call_join) … … 1015 976 end 1016 977 1017 # æåã«è¦ã¤ãã£ãæå¹ãªãã³ãã©ã¿ã¤ãã使ç¨978 # 最初に見つかった有効なハンドラタイプを使用 1018 979 ht = matches[0] 1019 980 1020 # éç¥ãã³ãã©ã§ãã¨ã©ã¼ãçºçããã¯ãããªããã®ã«ãã¨ã©ã¼ãã³ãã©ãæå®ããã¦ããã1021 # ãããã¯ãã®éã®ãã¿ã¼ã³ãæ¤åºããã1022 # (handler_flag ãnilã§ããå ´åããã³ãã©ã¿ã¤ããä¸æã§ãããã¨ã©ã¼ãçºçãããä¸æ1023 # ãªãããæ¤åºã¯è¡ããªãã)981 # 通知ハンドラで「エラーが発生するはずがない」のに「エラーハンドラが指定されている」 982 # もしくはその逆のパターンを検出する。 983 # (handler_flagがnilである場合、ハンドラタイプが不明であり、エラーが発生するか不明 984 # なため、検出は行わない。) 1024 985 if handler == ERROR_HANDLER && !ht.is_a?(NullHandlerType) && !event_handler_might_fail 1025 986 cdl_error( "ASP1004 cell $1: handler type $2 which never raises an error was inferred for the normal notification handler, but an error notification handler was specified.", … … 1036 997 end 1037 998 1038 # éç¥æ¹æ³ã®éçAPIè¨è¿°ãçæãã999 # 通知方法の静的API記述を生成する 1039 1000 handler_flag = ht.gen_cfg_handler_type(handler) 1040 1001 handler_flags << handler_flag if handler_flag … … 1050 1011 } 1051 1012 1052 # $id$ çã®ç½®æ1013 # $id$等の置換 1053 1014 name_array = cell.get_celltype.get_name_array(cell) 1054 1015 handler_args.collect! { |e| … … 1060 1021 } 1061 1022 1062 # tecsgen.cfg ã®è¨è¿°ãçæããã1063 # factory ã«å¯¾ãããã©ã¡ã¼ã¿ç½®æãè¡ãã1023 # tecsgen.cfgの記述を生成する。 1024 # factoryに対し、パラメータ置換を行う。 1064 1025 # {{attribute_name}} -> attribute_value 1065 1026 text = @factory.gsub(/\{\{([a-zA-Z0-9_]*?)\}\}/) { |match| … … 1067 1028 subst_attr = cell.get_celltype.find(name) 1068 1029 1069 # {{_handler_params_}} ã¯ãã³ãã©ã®æå®ã«ç½®æããã1030 # {{_handler_params_}} はハンドラの指定に置換する。 1070 1031 if name == :_handler_params_ 1071 1032 args_joined = handler_flags.join(' | ') … … 1078 1039 1079 1040 unless subst_attr 1080 # å±æ§ãè¦ã¤ãããªãã¨ããã¨ã©ã¼ã¯ãã§ã«å ±åããã¦ããã®ã§1081 # ããã§ã¯ããã¼å¤ãè¿ãã¦ããã ãã§ããã1041 # 属性が見つからないというエラーはすでに報告されているので 1042 # ここではダミー値を返しておくだけである。 1082 1043 next "" 1083 1044 end … … 1085 1046 subst_attr_join = cell.get_join_list.get_item(name) 1086 1047 if subst_attr_join 1087 # ã»ã«çææã«åæåããå ´å1048 # セル生成時に初期化する場合 1088 1049 subst = subst_attr_join.get_rhs.to_s 1089 1050 else 1090 # ã»ã«ã¿ã¤ãã®åæåå¤ã使ãå ´å1051 # セルタイプの初期化値を使う場合 1091 1052 subst = subst_attr.get_initializer.to_s 1092 1053 end 1093 1054 1094 # $id$ çã®ç½®æ1055 # $id$等の置換 1095 1056 cell.get_celltype.subst_name(subst, name_array) 1096 1057 } 1097 1058 1098 # åºå1059 # 出力 1099 1060 kernelCfg.puts text 1100 1061 -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.