Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/NotifierPlugin.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    1111#
    1212#--
    13 #   ä¸Šè¨˜è‘—作権è€
    14 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    15 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    16 #   å¤‰ãƒ»å†é
    17 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    18 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    19 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    20 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    21 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    22 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    23 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    24 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    25 #       è€
    26 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    27 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    28 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    29 #       ç”¨ã§ããªã„形で再é
    30 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    31 #       ã¨ï¼Ž
    32 #     (a) 再é
    33 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    34 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    35 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    36 #     (b) 再é
    37 å¸ƒã®å½¢æ
    38 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    39 #         å ±å‘Šã™ã‚‹ã“と.
    40 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    41 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    42 ãŠã‚ˆã³TOPPERSプロジェクトをå
    43 è²¬ã™ã‚‹ã“と.
    44 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    45 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    46 ãŠã‚ˆã³TOPPERSプロジェクトを
    47 #       å
    48 è²¬ã™ã‚‹ã“と.
     13#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     14#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     15#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     16#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     17#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     18#       スコード中に含まれていること.
     19#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     20#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     21#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     22#       の無保証規定を掲載すること.
     23#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     24#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     25#       と.
     26#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     27#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     28#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     29#         報告すること.
     30#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     31#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     32#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     33#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     34#       免責すること.
    4935
    50 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    51 ãŠ
    52 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    53 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    54 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    55 #   ã®è²¬ä»»ã‚’負わない.
     36#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     37#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     38#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     39#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     40#   の責任を負わない.
    5641
    5742#  $Id$
     
    6550class NotifierPlugin < CelltypePlugin
    6651
    67         # ---------- アダプタ関数の生成 -------------
     52        # ---------- アダプタ関数の生成 -------------
    6853        #
    69         # siHandlerBodyの受け口関数は,タイムイベント通知の通知å
    70 ˆã¨ã—て直接指定する
    71         # ことはできない.シグネチャが一致していないことが理由である.このため,アダ
    72         # プタとして動作する関数を生成し,カーネルからの呼出しをTECSの呼出しに変換で
    73         # きるようにするå¿
    74 è¦ãŒã‚る.
     54        # siHandlerBodyの受け口関数は,タイムイベント通知の通知先として直接指定する
     55        # ことはできない.シグネチャが一致していないことが理由である.このため,アダ
     56        # プタとして動作する関数を生成し,カーネルからの呼出しをTECSの呼出しに変換で
     57        # きるようにする必要がある.
    7558        #
    76         # 基本的には,受け口毎にアダプタ関数を生成すれば十分である.しかし,これでは
    77         # メモリ消費量が不å¿
    78 è¦ã«å¢—加してしまう.そこで,通知å
    79 ˆé–¢æ•°ã«intptr_t型の引数
    80         # を渡せることに着目し,関数の"一般化"を図る.すなわち受け口のある属性(ここ
    81         # では,結合å
    82 ˆã®ã‚»ãƒ«ï¼Œæ·»å­—などを指す)を,アダプタ関数の引数として受け取れる
    83         # ようにし,1個のアダプタ関数を2個以上の結合に対し用いることができるように
    84         # する.
     59        # 基本的には,受け口毎にアダプタ関数を生成すれば十分である.しかし,これでは
     60        # メモリ消費量が不必要に増加してしまう.そこで,通知先関数にintptr_t型の引数
     61        # を渡せることに着目し,関数の"一般化"を図る.すなわち受け口のある属性(ここ
     62        # では,結合先のセル,添字などを指す)を,アダプタ関数の引数として受け取れる
     63        # ようにし,1個のアダプタ関数を2個以上の結合に対し用いることができるように
     64        # する.
    8565        #
    86         # アダプタ関数の属性について整理すると,
    87         #  - 受け口関数 - 一般化を行うと,実行時コストが大きく増大してしまうことが
    88         #    確認されている.このため,一般化は行わない.EntryPropertyにも含めない.
    89         #  - セルインデックス - CELLIDX型で,型の規定はないが,"ホ゜インタ値て゛あったり
    90         #    整数値て゛あったりする。" (TECS 5.3.6) より,インデックスかポインタある
    91         #    ことが分かる.インデックスだとすると,この値はセルCBのアドレッシングに
    92         #    使用されるので,intptr_tに収まる筈である.ポインタの場合,当然intptr_t
    93         #    に収まる.
    94         #  - 受け口é
    95 åˆ—の添字 - int_t.同様にintptr_tに収まる筈である.
    96         # これらのうち,セルインデックスと受け口é
    97 åˆ—の添字はパラメータに含めることが
    98         # できそうであるが,両方は無理である.
    99         # 両方を格納したé
    100 åˆ—を生成し,そのé
    101 åˆ—の要素へのポインタを渡すようにするとい
    102         # う選択肢も可能であるが,実行速度を優å
    103 ˆã™ã‚‹ãŸã‚ã«ï¼Œã“の方法はとらなかった.
     66        # アダプタ関数の属性について整理すると,
     67        #  - 受け口関数 - 一般化を行うと,実行時コストが大きく増大してしまうことが
     68        #    確認されている.このため,一般化は行わない.EntryPropertyにも含めない.
     69        #  - セルインデックス - CELLIDX型で,型の規定はないが,"ホ゜インタ値て゛あったり
     70        #    整数値て゛あったりする。" (TECS 5.3.6) より,インデックスかポインタある
     71        #    ことが分かる.インデックスだとすると,この値はセルCBのアドレッシングに
     72        #    使用されるので,intptr_tに収まる筈である.ポインタの場合,当然intptr_t
     73        #    に収まる.
     74        #  - 受け口配列の添字 - int_t.同様にintptr_tに収まる筈である.
     75        # これらのうち,セルインデックスと受け口配列の添字はパラメータに含めることが
     76        # できそうであるが,両方は無理である.
     77        # 両方を格納した配列を生成し,その配列の要素へのポインタを渡すようにするとい
     78        # う選択肢も可能であるが,実行速度を優先するために,この方法はとらなかった.
    10479        #
    105         # このため,一般化は以下のパターンに分類して行う.
     80        # このため,一般化は以下のパターンに分類して行う.
    10681        #
    107         # 1. セルインデックスのみ一般化.セルインデックスのパターン数が受け口é
    108 åˆ—の
    109         #    添字のパターン数より多いか,あるいは受け口がé
    110 åˆ—でない場合に行われる.
    111         # 2. 受け口é
    112 åˆ—の添字のみ一般化.この場合,セルごとに異なる関数を用いる.
     82        # 1. セルインデックスのみ一般化.セルインデックスのパターン数が受け口配列の
     83        #    添字のパターン数より多いか,あるいは受け口が配列でない場合に行われる.
     84        # 2. 受け口配列の添字のみ一般化.この場合,セルごとに異なる関数を用いる.
    11385        #
    114         # これより,各受け口関数について,アダプタ関数の生成個数は,
    115         #         O(min{セルインデックスのパターン数, 添字のパターン数})
    116         # となる.
     86        # これより,各受け口関数について,アダプタ関数の生成個数は,
     87        #         O(min{セルインデックスのパターン数, 添字のパターン数})
     88        # となる.
    11789        #
    118         # プラグインでの処理をワンパスで行うために,tecsgen.cfgではアダプタ関数を直
    119         # 接指定するのではなく,代わりにアダプタ関数を表すマクロを使用する.この
    120         # マクロはアダプタ関数ハンドルと呼ぶことにする.
    121         # アダプタ関数ハンドルは,次の2個の要素から成る.
    122         #  - アダプタ関数へののポインタ
    123         #  - アダプタ関数の引数
     90        # プラグインでの処理をワンパスで行うために,tecsgen.cfgではアダプタ関数を直
     91        # 接指定するのではなく,代わりにアダプタ関数を表すマクロを使用する.この
     92        # マクロはアダプタ関数ハンドルと呼ぶことにする.
     93        # アダプタ関数ハンドルは,次の2個の要素から成る.
     94        #  - アダプタ関数へののポインタ
     95        #  - アダプタ関数の引数
    12496        #
    12597        #   $Id$
     
    128100        class AdapterGenerator
    129101
    130                 # 結合å
    131 ˆã«é–¢ã™ã‚‹å±žæ€§ã‚’含む.セル,受け口é
    132 åˆ—の添字から成る.
    133                 # 同一のEntryPropertyとなる結合は,å
    134 ¨ãåŒã˜æ–¹æ³•ã§ãã®å—け口関数を呼び
    135                 # 出せる.
     102                # 結合先に関する属性を含む.セル,受け口配列の添字から成る.
     103                # 同一のEntryPropertyとなる結合は,全く同じ方法でその受け口関数を呼び
     104                # 出せる.
    136105                # @private
    137106                class EntryProperty
    138                         # @return [Cell] 受け口側のセル.
     107                        # @return [Cell] 受け口側のセル.
    139108                        attr_reader :cell
    140109
    141                         # @return [Integer, nil] 受け口é
    142 åˆ—の添字.é
    143 åˆ—でない場合はnil.
     110                        # @return [Integer, nil] 受け口配列の添字.配列でない場合はnil.
    144111                        attr_reader :subscript
    145112
     
    153120                        end
    154121
    155                         # 同値性の定義.Hashのキーとして使用するのにå¿
    156 è¦ï¼Ž
     122                        # 同値性の定義.Hashのキーとして使用するのに必要.
    157123                        def eql?(o) @cell == o.cell && @subscript == o.subscript end
    158124                        def hash() @cell.hash ^ @subscript.hash end
     
    161127                # @private
    162128                class EntryPort
    163                         # @param [Port] port 結合å
    164 ˆã®ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の受け口.
     129                        # @param [Port] port 結合先のセルのセルタイプの受け口.
    165130                        def initialize(port, prefix)
    166131                                @port = port
    167132                                @global_name = "#{prefix}_#{@port.get_celltype.get_global_name}_#{@port.get_name}"
    168133
    169                                 # 受け口関数名.siHandlerBodyを想定しているので,関数名はmainで固定である.
     134                                # 受け口関数名.siHandlerBodyを想定しているので,関数名はmainで固定である.
    170135                                @entry_fn_name = "#{@port.get_celltype.get_global_name}_#{@port.get_name}_main"
    171136
     
    174139                        end
    175140
    176                         # @return [String] グローバルに一意(なものとして扱えるよう)な識別子.
     141                        # @return [String] グローバルに一意(なものとして扱えるよう)な識別子.
    177142                        attr_reader :global_name
    178143
     
    180145                        attr_reader :port
    181146
    182                         # 指定したEntryPropertyに対応するアダプタ関数ハンドルを取得する.
     147                        # 指定したEntryPropertyに対応するアダプタ関数ハンドルを取得する.
    183148                        # @param [EntryProperty] ep
    184                         # @return [String] アダプタ関数ハンドル.
     149                        # @return [String] アダプタ関数ハンドル.
    185150                        # @private
    186151                        def adapter_handle_for_entry_property(ep)
     
    192157                        end
    193158
    194                         # 結合å
    195 ˆã®æƒ
    196 å ±ã«å¿œã˜ãŸã‚¢ãƒ€ãƒ—タ関数をソース・ヘッダーに出力する.
    197                         # 一般化指定は,`cell`または`subscript`の一方のみ行うことができる.
     159                        # 結合先の情報に応じたアダプタ関数をソース・ヘッダーに出力する.
     160                        # 一般化指定は,`cell`または`subscript`の一方のみ行うことができる.
    198161                        #
    199162                        # @param [AdapterGenerator] context
    200                         # @param [String] fn_name 関数名.
    201                         # @param [Cell, Symbol] cell セル.セルについて一般化する場合は `:generic`
    202                         # @param [Integer, Symbol, nil] subscript 添字.添字について一般化する場合は `:generic`
    203                         # @param [Celltype] 呼びå
    204 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—、cell==:generic の場合のみ有効
     163                        # @param [String] fn_name 関数名.
     164                        # @param [Cell, Symbol] cell セル.セルについて一般化する場合は `:generic`
     165                        # @param [Integer, Symbol, nil] subscript 添字.添字について一般化する場合は `:generic`
     166                        # @param [Celltype] 呼び先のセルタイプ、cell==:generic の場合のみ有効
    205167                        # @private
    206168                        def generate_inner(context, fn_name, cell, subscript, callee_ct=nil)
     
    213175                                ct = @port.get_celltype
    214176
    215                                 # シングルトンセルタイプ以外では,CELLIDXの指定がå¿
    216 è¦ï¼Ž
     177                                # シングルトンセルタイプ以外では,CELLIDXの指定が必要.
    217178                                unless ct.is_singleton?
    218179                                        if cell == :generic
     
    220181                                                # params << "(CELLIDX)extinf"
    221182                                        else
    222                                                 # セルのCELLIDXを得る
     183                                                # セルのCELLIDXを得る
    223184                                                if ct.has_INIB? || ct.has_CB?
    224185                                                        params << ct.get_name_array(cell)[7]
     
    229190                                end
    230191
    231                                 # 受け口é
    232 åˆ—の添字.
     192                                # 受け口配列の添字.
    233193                                if @port.get_array_size
    234194                                        if subscript == :generic
     
    248208                        end
    249209
    250                         # 指定したJoinに対応するアダプタ関数ハンドルを取得する.
    251                         # @return [Array] アダプタ関数ハンドル.
     210                        # 指定したJoinに対応するアダプタ関数ハンドルを取得する.
     211                        # @return [Array] アダプタ関数ハンドル.
    252212                        def make_adapter_handle(join)
    253213                                prop = EntryProperty.from_join(join)
     
    259219                        end
    260220
    261                         # ソース・ヘッダーの記述を生成する.
     221                        # ソース・ヘッダーの記述を生成する.
    262222                        # @param [AdapterGenerator] context
    263223                        def generate(context)
     
    273233                                no_cellidx = false
    274234                                if !(ct.has_INIB? || ct.has_CB?)
    275                                         # CB, INIB最適化により,CB, INIBが両方不要になったケース.
    276                                         # CELLIDXが不要であるので,セルについて一般化しても意味
    277                                         # はないので,添字による一般化を選択する.
     235                                        # CB, INIB最適化により,CB, INIBが両方不要になったケース.
     236                                        # CELLIDXが不要であるので,セルについて一般化しても意味
     237                                        # はないので,添字による一般化を選択する.
    278238                                        generalize_by_cell_idx = false
    279239                                        no_cellidx = true
    280240
    281                                         # å
    282 ¨ã¦ã®ã‚»ãƒ«ã‚’同一視する.
     241                                        # 全てのセルを同一視する.
    283242                                        cells = { @props[0].cell => @props }
    284243
    285244                                        header_file.print " * No INIB & CB: generalized by subscript\n"
    286245                                elsif @port.get_array_size
    287                                         # 一般化パターンの分類を行うために,受け口側セルや添字の
    288                                         # パターン数を分析して,最適な方を選択する.
     246                                        # 一般化パターンの分類を行うために,受け口側セルや添字の
     247                                        # パターン数を分析して,最適な方を選択する.
    289248                                        generalize_by_cell_idx = cells.length >= subscripts.length
    290249                                        if generalize_by_cell_idx
     
    294253                                        end
    295254                                else
    296                                         # 常にCELLIDXで一般化
     255                                        # 常にCELLIDXで一般化
    297256                                        generalize_by_cell_idx = true
    298257                                        header_file.print " * non-array entry port: generalized by cell\n"
     
    302261
    303262                                if generalize_by_cell_idx
    304                                         # CELLIDXについて一般化
     263                                        # CELLIDXについて一般化
    305264                                        subscripts.each { |subscript, props|
    306265                                                if subscript
    307266                                                        fn_name = "#{@global_name}_adap_#{subscript}"
    308267                                                else
    309                                                         # 受け口é
    310 åˆ—でない場合
     268                                                        # 受け口配列でない場合
    311269                                                        fn_name = "#{@global_name}_adap"
    312270                                                end
     
    318276                                                        handle = adapter_handle_for_entry_property(prop)
    319277
    320                                                         # セルのCELLIDXを得る
     278                                                        # セルのCELLIDXを得る
    321279                                                        if ct.has_INIB? || ct.has_CB?
    322280                                                                idx = ct.get_name_array(prop.cell)[7]
     
    329287                                        }
    330288                                else
    331                                         # 添字について一般化
     289                                        # 添字について一般化
    332290                                        cells.each { |cell, props|
    333291                                                if no_cellidx
    334                                                         # CB/INIB なし
     292                                                        # CB/INIB なし
    335293                                                        fn_name = "#{@global_name}_adap"
    336294                                                else
     
    358316                attr :header_file
    359317
    360                 # @param [String] celltype_name ハンドラ関数のセルタイプ.
    361                 # @param [String] prefix 名前衝突を防ぐためのプレフィックス.
     318                # @param [String] celltype_name ハンドラ関数のセルタイプ.
     319                # @param [String] prefix 名前衝突を防ぐためのプレフィックス.
    362320                def initialize(celltype_name, prefix)
    363321                        @celltype_name = celltype_name
     
    369327
    370328                # ===AdapterGenerator#make_adapter_handle===
    371                 # 指定した結合の呼出しを行うためのアダプタ関数ハンドルを生成する.
    372                 # @return [Array] アダプタ関数ハンドル.
     329                # 指定した結合の呼出しを行うためのアダプタ関数ハンドルを生成する.
     330                # @return [Array] アダプタ関数ハンドル.
    373331                def make_adapter_handle(join)
    374332                        entry_port = @entry_ports[join.get_rhs_port]
     
    382340
    383341                # ===AdapterGenerator#finish===
    384                 # 各受け口に対し,アダプタ関数を生成する.
     342                # 各受け口に対し,アダプタ関数を生成する.
    385343                def finish
    386344                        @source_file = AppFile.open( "#{$gen}/#{@celltype_name}.c" )
     
    392350                @header_file.print "\n/* Generated by #{self.class.name} */\n\n"
    393351
    394                         # NotifierPluginを使用するセルタイプが複数ある場合,それぞれに
    395                         # 対しAdapterGenerator#finishが呼び出される.tTimeEventHandler.hに
    396                         # 続けて書き込んでしまうと,ヘッダーガードの関係で2回目以降の記述
    397                         # が読み込まれなくなってしまう.このため,ファイル名 + セルタイプ名
    398                         # という少し特殊なヘッダーガードを用いる.
     352                        # NotifierPluginを使用するセルタイプが複数ある場合,それぞれに
     353                        # 対しAdapterGenerator#finishが呼び出される.tTimeEventHandler.hに
     354                        # 続けて書き込んでしまうと,ヘッダーガードの関係で2回目以降の記述
     355                        # が読み込まれなくなってしまう.このため,ファイル名 + セルタイプ名
     356                        # という少し特殊なヘッダーガードを用いる.
    399357                        header_guard = "#{@celltype_name}_H_#{@prefix}"
    400358
     
    402360                @header_file.print "\#define #{header_guard}\n\n"
    403361
    404                 # カーネルコンフィギュレータを実行する際,ハンドラ受け口のセルタイプ
    405                 # のセルCBの定義がå¿
    406 è¦ãªå ´åˆãŒã‚る.
     362                # カーネルコンフィギュレータを実行する際,ハンドラ受け口のセルタイプ
     363                # のセルCBの定義が必要な場合がある.
    407364                @header_file.print "\#include \"#{@celltype_name}_aux.h\"\n\n"
    408365
    409                         # 結合å
    410 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の定義は,自分のセルのtecsgen.hよりもå
    411 ˆã«
    412                         # 読み込まなければならないが,このプラグインが複数実行されると,
    413                         # 順序が崩れてしまう.そこで,結合å
    414 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の定義はもう一つの
    415                         # ヘッダーファイル(tCelltypeName_aux.h)から読み込むようにする.
     366                        # 結合先のセルタイプの定義は,自分のセルのtecsgen.hよりも先に
     367                        # 読み込まなければならないが,このプラグインが複数実行されると,
     368                        # 順序が崩れてしまう.そこで,結合先のセルタイプの定義はもう一つの
     369                        # ヘッダーファイル(tCelltypeName_aux.h)から読み込むようにする.
    416370                        aux_header_file = AppFile.open( "#{$gen}/#{@celltype_name}_aux.h" )
    417371                aux_header_file.print "\n/* Generated by #{self.class.name} */\n\n"
     
    424378                        cb_type_only_guard = "#{@celltype_name}_AUX_H_#{@prefix}_CB_TYPE_ONLY"
    425379
    426                         # 結合å
    427 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の定義を読み込む
     380                        # 結合先のセルタイプの定義を読み込む
    428381                        aux_header_file.print "#ifndef TOPPERS_CB_TYPE_ONLY\n"
    429382                    aux_header_file.print "#define TOPPERS_CB_TYPE_ONLY\n"
     
    456409        end
    457410
    458         # ------ 通知のハンドラの種類の定義 -------
     411        # ------ 通知のハンドラの種類の定義 -------
    459412
    460413        class Handler
     
    466419        end
    467420
    468         # 通常のハンドラ
     421        # 通常のハンドラ
    469422        EVENT_HANDLER = Handler::new("ciNotificationHandler")
    470423
    471         # エラーハンドラ (通常のハンドラが失敗した場合に呼び出される)
     424        # エラーハンドラ (通常のハンドラが失敗した場合に呼び出される)
    472425        ERROR_HANDLER = Handler::new("ciErrorNotificationHandler")
    473426
     
    492445        end
    493446
    494         # ------ 通知の属性の定義 -------
     447        # ------ 通知の属性の定義 -------
    495448        #
    496         # ハンドラタイプに合致しない属性が指定された場合に
    497         # エラーを出力できるよう、å
    498 ¨ã¦ã®å±žæ€§ã‚’ここで列挙する。
     449        # ハンドラタイプに合致しない属性が指定された場合に
     450        # エラーを出力できるよう、全ての属性をここで列挙する。
    499451
    500452        SETVAR_ADDR_ATTR =   HandlerAttribute::new("setVariableAddress")
     
    512464        ]
    513465
    514         # ------ ハンドラタイプの定義 -------
     466        # ------ ハンドラタイプの定義 -------
    515467
    516468        class BaseHandlerType
     
    526478
    527479            #=== NotifierPlugin#BaseHandlerType#validate_join
    528             # 指定したセルの結合å
    529 ˆãŒã€ã“のハンドラタイプに該当するかを検証
    530             # handler:: Handler : ハンドラ
    531             # cell:: Cell : セル
    532             # join:: Join : 結合 (declarationがPortであるもの)
     480            # 指定したセルの結合先が、このハンドラタイプに該当するかを検証
     481            # handler:: Handler : ハンドラ
     482            # cell:: Cell : セル
     483            # join:: Join : 結合 (declarationがPortであるもの)
    533484                def validate_join(handler, cell, join)
    534485        return !generate_attr_map(handler, cell).nil?
     
    536487
    537488            #=== NotifierPlugin#BaseHandlerType#generate_attr_map
    538             # 指定したセルの属性と、既知のHandlerAttributeのマッピングを
    539             # 生成し、Hash<HandlerAttribute, Join> (各属性とそれに対応する
    540             # Join(declarationがDeclのもの)を表すHash)、あるいは、
    541                 # マッピングが行えない場合(属性の不足、過剰)はnilを返す。
     489            # 指定したセルの属性と、既知のHandlerAttributeのマッピングを
     490            # 生成し、Hash<HandlerAttribute, Join> (各属性とそれに対応する
     491            # Join(declarationがDeclのもの)を表すHash)、あるいは、
     492                # マッピングが行えない場合(属性の不足、過剰)はnilを返す。
    542493            #
    543             # handler:: Handler : ハンドラ
    544             # cell:: Cell : セル
     494            # handler:: Handler : ハンドラ
     495            # cell:: Cell : セル
    545496                def generate_attr_map(handler, cell)
    546497                        map = {}
     
    552503                                join = join_list.get_item(attr_name.to_sym)
    553504
    554                                 # このセルタイプにおいてå¿
    555 é ˆã®å±žæ€§ã‹?
     505                                # このセルタイプにおいて必須の属性か?
    556506                                is_required = @required_attributes.include?(known_attr)
    557507
    558                                 # 属性の指定が不足している? or 過剰?
    559                                 # 注: ハンドラタイプの判別には、セルで値が指定されているか
    560                                 #     ãŒè€ƒæ
    561 ®ã•ã‚Œã‚‹ã€‚セルタイプで初期値が指定されていても、
    562                                 #     ãã‚Œã¯ãƒãƒ³ãƒ‰ãƒ©ã‚¿ã‚¤ãƒ—の決定に影響しない。
     508                                # 属性の指定が不足している? or 過剰?
     509                                # 注: ハンドラタイプの判別には、セルで値が指定されているか
     510                                #     が考慮される。セルタイプで初期値が指定されていても、
     511                                #     それはハンドラタイプの決定に影響しない。
    563512                                return nil if join.nil? != !is_required
    564513
    565                                 # å¿
    566 è¦ã®ãªã„属性であり、指定もされていないので飛ばす
     514                                # 必要のない属性であり、指定もされていないので飛ばす
    567515                                next if join.nil?
    568516
    569                                 # TODO: attrの結合であることを検証
     517                                # TODO: attrの結合であることを検証
    570518
    571519                                map[known_attr] = join
     
    576524
    577525            #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_type
    578             # タイムイベントの通知の種類を表すコンフィギュレータの記述を生成し、Stringまたはnilを返す
    579             # handler:: Handler : ハンドラ
     526            # タイムイベントの通知の種類を表すコンフィギュレータの記述を生成し、Stringまたはnilを返す
     527            # handler:: Handler : ハンドラ
    580528                def gen_cfg_handler_type(handler)
    581529                raise "called abstract method gen_cfg_handler_type"
     
    583531
    584532            #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_parameters
    585             # タイムイベントの通知の引数を表すコンフィギュレータの記述を生成し、String[]を返す
    586             # handler:: Handler : ハンドラ
    587             # join:: Join : 結合 (declarationがPortであるもの)
     533            # タイムイベントの通知の引数を表すコンフィギュレータの記述を生成し、String[]を返す
     534            # handler:: Handler : ハンドラ
     535            # join:: Join : 結合 (declarationがPortであるもの)
    588536            # attrMap:: Hash<HandlerAttribute, Join> :
    589             #     å„属性とそれに対応するJoin (declarationがDeclのもの)
    590             # cell:: Cell : セル
    591                 # adpt_gen:: AdapterGenerator : アダプタ関数を生成するオブジェクト
     537            #     各属性とそれに対応するJoin (declarationがDeclのもの)
     538            # cell:: Cell : セル
     539                # adpt_gen:: AdapterGenerator : アダプタ関数を生成するオブジェクト
    592540                def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
    593541                return nil
     
    595543
    596544            #=== NotifierPlugin#BaseHandlerType#might_fail
    597             # 通知の際、エラーが発生し、その結果エラー通知を呼ぶå¿
    598 è¦ãŒç”Ÿã˜ã‚‹
    599             # かどうかを返す。
     545            # 通知の際、エラーが発生し、その結果エラー通知を呼ぶ必要が生じる
     546            # かどうかを返す。
    600547                def might_fail
    601548                        return false
     
    613560                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    614561                        if id_attr_join
    615                                 # セル生成時に初期化する場合
     562                                # セル生成時に初期化する場合
    616563                                id = id_attr_join.get_rhs.to_s
    617564                        else
    618                                 # セルタイプの初期化値を使う場合
     565                                # セルタイプの初期化値を使う場合
    619566                                id = id_attr.get_initializer.to_s
    620567                        end
    621568
    622                         # $id$等の置換
     569                        # $id$等の置換
    623570                        name_array = taskCell.get_celltype.get_name_array(taskCell)
    624571                        id = taskCell.get_celltype.subst_name(id, name_array)
     
    673620                        var_value = attrMap[SETVAR_VALUE_ATTR].get_rhs.to_s
    674621
    675                         # $id$等の置換
     622                        # $id$等の置換
    676623                        name_array = cell.get_celltype.get_name_array(cell)
    677624                        var_addr = cell.get_celltype.subst_name(var_addr, name_array)
     
    702649                        var_addr = attrMap[SETVAR_ADDR_ATTR].get_rhs.to_s
    703650
    704                         # $id$等の置換
     651                        # $id$等の置換
    705652                        name_array = cell.get_celltype.get_name_array(cell)
    706653                        var_addr = cell.get_celltype.subst_name(var_addr, name_array)
     
    729676                        var_addr = attrMap[INCVAR_ADDR_ATTR].get_rhs.to_s
    730677
    731                         # $id$等の置換
     678                        # $id$等の置換
    732679                        name_array = cell.get_celltype.get_name_array(cell)
    733680                        var_addr = cell.get_celltype.subst_name(var_addr, name_array)
     
    753700                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    754701                        if id_attr_join
    755                                 # セル生成時に初期化する場合
     702                                # セル生成時に初期化する場合
    756703                                id = id_attr_join.get_rhs.to_s
    757704                        else
    758                                 # セルタイプの初期化値を使う場合
     705                                # セルタイプの初期化値を使う場合
    759706                                id = id_attr.get_initializer.to_s
    760707                        end
    761708
    762                         # $id$等の置換
     709                        # $id$等の置換
    763710                        name_array = semaphoreCell.get_celltype.get_name_array(semaphoreCell)
    764711                        id = semaphoreCell.get_celltype.subst_name(id, name_array)
     
    793740                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    794741                        if id_attr_join
    795                                 # セル生成時に初期化する場合
     742                                # セル生成時に初期化する場合
    796743                                id = id_attr_join.get_rhs.to_s
    797744                        else
    798                                 # セルタイプの初期化値を使う場合
     745                                # セルタイプの初期化値を使う場合
    799746                                id = id_attr.get_initializer.to_s
    800747                        end
    801748                        flg_pattern = attrMap[SETFLG_FLAG_ATTR].get_rhs.to_s
    802749
    803                         # $id$等の置換
     750                        # $id$等の置換
    804751                        name_array = eventflagCell.get_celltype.get_name_array(eventflagCell)
    805752                        id = eventflagCell.get_celltype.subst_name(id, name_array)
     
    834781                        id_attr = join.get_rhs_cell.get_celltype.find(:id)
    835782                        if id_attr_join
    836                                 # セル生成時に初期化する場合
     783                                # セル生成時に初期化する場合
    837784                                id = id_attr_join.get_rhs.to_s
    838785                        else
    839                                 # セルタイプの初期化値を使う場合
     786                                # セルタイプの初期化値を使う場合
    840787                                id = id_attr.get_initializer.to_s
    841788                        end
    842789
    843                         # $id$等の置換
     790                        # $id$等の置換
    844791                        name_array = dataqueueCell.get_celltype.get_name_array(dataqueueCell)
    845792                        id = dataqueueCell.get_celltype.subst_name(id, name_array)
     
    868815                        sent_value = attrMap[SNDDTQ_VALUE_ATTR].get_rhs.to_s
    869816
    870                         # $id$等の置換
     817                        # $id$等の置換
    871818                        name_array = cell.get_celltype.get_name_array(cell)
    872819                        sent_value = cell.get_celltype.subst_name(sent_value, name_array)
     
    910857                end
    911858                def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
    912                         # tTimeEventHandlerの結合å
    913 ˆã‚’取得
     859                        # tTimeEventHandlerの結合先を取得
    914860                        handler_cell = join.get_rhs_cell
    915861                call_join = handler_cell.get_join_list.get_item(:ciHandlerBody)
    916862
    917                         # 結合されていない場合はtecsgenがエラーを出すはずなのでここでは
    918                         # エラーにせず無視する.
     863                        # 結合されていない場合はtecsgenがエラーを出すはずなのでここでは
     864                        # エラーにせず無視する.
    919865                        return [] unless call_join
    920866
    921                         # アダプタ関数ハンドルを取得
     867                        # アダプタ関数ハンドルを取得
    922868                        adapter_handle = adpt_gen.make_adapter_handle(call_join)
    923869                return [adapter_handle[1], adapter_handle[0]]
     
    953899
    954900    #@celltype:: Celltype
    955     #@option:: String     :オプション文字列
     901    #@option:: String     :オプション文字列
    956902    def initialize( celltype, option )
    957903        super
    958904        @plugin_arg_check_proc_tab = NotifierPluginArgProc
    959905        @plugin_arg_str = option
    960         @plugin_arg_str = option.gsub( /\A"(.*)/, '\1' )    # 前後の "" を取り除く
     906        @plugin_arg_str = option.gsub( /\A"(.*)/, '\1' )    # 前後の "" を取り除く
    961907        @plugin_arg_str.sub!( /(.*)"\z/, '\1' )
    962908        @factory = nil
     
    996942        kernelCfg.print "\#include \"tTimeEventHandler.h\"\n"
    997943
    998                 # アダプタ関数を生成する準備
     944                # アダプタ関数を生成する準備
    999945                @adpt_gen = AdapterGenerator.new("tTimeEventHandler", @celltype.get_global_name)
    1000946
    1001         # 属性置換が行えることを検証する。
    1002         # ここで行うのは、factoryで指定された属性名が
    1003         # 存在することを確認し、しなければエラーを出力することのみである。
    1004         # セルごとの処理の最中にエラーを出力することも可能ではあるが、
    1005         # そうするとセルタイプ側の問題であるのにもかかわらず、セルごとに
    1006         # エラーが表示されてしまう。
     947        # 属性置換が行えることを検証する。
     948        # ここで行うのは、factoryで指定された属性名が
     949        # 存在することを確認し、しなければエラーを出力することのみである。
     950        # セルごとの処理の最中にエラーを出力することも可能ではあるが、
     951        # そうするとセルタイプ側の問題であるのにもかかわらず、セルごとに
     952        # エラーが表示されてしまう。
    1007953        # {{attribute_name}} -> attribute_value
    1008954        @factory.scan(/\{\{([a-zA-Z0-9_]*?)\}\}/) { |match|
    1009955                name = $1.to_sym
    1010956
    1011                 # {{_handler_params_}} はハンドラに関する指定。プラグインå†
    1012 ã§å€¤ãŒç”Ÿæˆã•ã‚Œã‚‹
     957                # {{_handler_params_}} はハンドラに関する指定。プラグイン内で値が生成される
    1013958                next if name == :_handler_params_
    1014959
     
    1024969        }
    1025970
    1026                 # アダプタ関数の生成を完了させる
     971                # アダプタ関数の生成を完了させる
    1027972                @adpt_gen.finish
    1028973
     
    1039984        handler_flag = nil
    1040985
    1041                 # ignoreErrorsを取得
     986                # ignoreErrorsを取得
    1042987                ignoreErrors_attr_join = cell.get_join_list.get_item(:ignoreErrors)
    1043988                ignoreErrors_attr = cell.get_celltype.find(:ignoreErrors)
    1044989                if ignoreErrors_attr_join
    1045                         # セル生成時に初期化する場合
     990                        # セル生成時に初期化する場合
    1046991                        ignoreErrors = ignoreErrors_attr_join.get_rhs.to_s
    1047992                else
    1048                         # セルタイプの初期化値を使う場合
     993                        # セルタイプの初期化値を使う場合
    1049994                        ignoreErrors = ignoreErrors_attr.get_initializer.to_s
    1050995                end
     
    10581003                end
    10591004
    1060     # ドメイン指定用文字列
     1005    # ドメイン指定用文字列
    10611006    pre_text  = ""
    10621007    post_text = "\n"
     
    10641009 
    10651010        [EVENT_HANDLER, ERROR_HANDLER].each { |handler|
    1066                 # 呼び口の結合を取得
     1011                # 呼び口の結合を取得
    10671012                call_join = cell.get_join_list.get_item(handler.call_port_name.to_sym)
    10681013        domain_root = cell.get_region.get_domain_root
     
    10781023        end
    10791024
    1080                 # ハンドラタイプを判別する
     1025                # ハンドラタイプを判別する
    10811026                matches = HANDLER_TYPES.select { |handler_type|
    10821027                        handler_type.validate_join(handler, cell, call_join)
     
    10881033        end
    10891034
    1090                         # 最初に見つかった有効なハンドラタイプを使用
     1035                        # 最初に見つかった有効なハンドラタイプを使用
    10911036                ht = matches[0]
    10921037
    1093       # ドメインプラグインが指定されている場合、所属ドメインのチェック
     1038      # ドメインプラグインが指定されている場合、所属ドメインのチェック
    10941039      domain_root = cell.get_region.get_domain_root
    10951040      if domain_root.get_domain_type then
     
    11191064              end
    11201065              dbgPrint "#{self.class.name}: match pattern 2.\n"
    1121                         when NullHandlerType.new  # エラー通知を指定していない
     1066                        when NullHandlerType.new  # エラー通知を指定していない
    11221067              dbgPrint "#{self.class.name}: match pattern 3.\n"
    11231068            end
     
    11401085      end
    11411086
    1142                         # 通知ハンドラで「エラーが発生するはずがない」のに「エラーハンドラが指定されている」
    1143                         # もしくはその逆のパターンを検出する。
    1144                         # (handler_flagがnilである場合、ハンドラタイプが不明であり、エラーが発生するか不明
    1145                         #  なため、検出は行わない。)
     1087                        # 通知ハンドラで「エラーが発生するはずがない」のに「エラーハンドラが指定されている」
     1088                        # もしくはその逆のパターンを検出する。
     1089                        # (handler_flagがnilである場合、ハンドラタイプが不明であり、エラーが発生するか不明
     1090                        #  なため、検出は行わない。)
    11461091                if handler == ERROR_HANDLER && !ht.is_a?(NullHandlerType) && !event_handler_might_fail
    11471092                        cdl_error2( cell.get_locale, "NTF1004 cell $1: handler type $2 which never raises an error was inferred for the normal notification handler, but an error notification handler was specified.",
     
    11581103                end
    11591104
    1160                         # 通知方法の静的API記述を生成する
     1105                        # 通知方法の静的API記述を生成する
    11611106                handler_flag = ht.gen_cfg_handler_type(handler)
    11621107                handler_flags << handler_flag if handler_flag
     
    11721117        }
    11731118
    1174                 # $id$等の置換
     1119                # $id$等の置換
    11751120                name_array = cell.get_celltype.get_name_array(cell)
    11761121                handler_args.collect! { |e|
     
    11821127                }
    11831128
    1184         # tecsgen.cfgの記述を生成する。
    1185         # factoryに対し、パラメータ置換を行う。
     1129        # tecsgen.cfgの記述を生成する。
     1130        # factoryに対し、パラメータ置換を行う。
    11861131        # {{attribute_name}} -> attribute_value
    11871132        text = @factory.gsub(/\{\{([a-zA-Z0-9_]*?)\}\}/) { |match|
     
    11891134                        subst_attr = cell.get_celltype.find(name)
    11901135
    1191                         # {{_handler_params_}} はハンドラの指定に置換する。
     1136                        # {{_handler_params_}} はハンドラの指定に置換する。
    11921137                        if name == :_handler_params_
    11931138                        args_joined = handler_flags.join(' | ')
     
    12001145
    12011146                        unless subst_attr
    1202                                 # 属性が見つからないというエラーはすでに報告されているので
    1203                                 # ここではダミー値を返しておくだけである。
     1147                                # 属性が見つからないというエラーはすでに報告されているので
     1148                                # ここではダミー値を返しておくだけである。
    12041149                                next ""
    12051150                        end
     
    12071152                        subst_attr_join = cell.get_join_list.get_item(name)
    12081153                        if subst_attr_join
    1209                                 # セル生成時に初期化する場合
     1154                                # セル生成時に初期化する場合
    12101155                                subst = subst_attr_join.get_rhs.to_s
    12111156                        else
    1212                                 # セルタイプの初期化値を使う場合
     1157                                # セルタイプの初期化値を使う場合
    12131158                                subst = subst_attr.get_initializer.to_s
    12141159                        end
    12151160
    1216                         # $id$等の置換
     1161                        # $id$等の置換
    12171162                        cell.get_celltype.subst_name(subst, name_array)
    12181163      }
    12191164
    1220      # 出力 (CRE_xxx)
     1165     # 出力 (CRE_xxx)
    12211166     kernelCfg.print pre_text
    12221167     kernelCfg.print indent, text, "\n"
Note: See TracChangeset for help on using the changeset viewer.