Index: asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/plugin/NotifierPlugin.rb
===================================================================
--- asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/plugin/NotifierPlugin.rb	(revision 359)
+++ asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/plugin/NotifierPlugin.rb	(revision 374)
@@ -1,3 +1,6 @@
 # -*- coding: utf-8 -*-
+#
+#  TECS Generator
+#      Generator for TOPPERS Embedded Component System
 #
 #  Copyright (C) 2015 by Ushio Laboratory
@@ -5,5 +8,38 @@
 #  Copyright (C) 2015-2016 by Embedded and Real-Time Systems Laboratory
 #              Graduate School of Information Science, Nagoya Univ., JAPAN
+#  Copyright (C) 2015-2018 by TOPPERS Project
 #
+#--
+#   上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
+#   ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+#   変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+#   (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+#       権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+#       スコード中に含まれていること．
+#   (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+#       用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+#       者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+#       の無保証規定を掲載すること．
+#   (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+#       用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+#       と．
+#     (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+#         作権表示，この利用条件および下記の無保証規定を掲載すること．
+#     (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+#         報告すること．
+#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+#       害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+#       また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+#       由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+#       免責すること．
+#  
+#   本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+#   よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+#   に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+#   アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+#   の責任を負わない．
+#  
+#  $Id$
+#++
 
 NotifierPluginArgProc = {
@@ -128,6 +164,7 @@
 			# @param [Cell, Symbol] cell セル．セルについて一般化する場合は `:generic`
 			# @param [Integer, Symbol, nil] subscript 添字．添字について一般化する場合は `:generic`
+			# @param [Celltype] 呼び先のセルタイプ、cell==:generic の場合のみ有効
 			# @private
-			def generate_inner(context, fn_name, cell, subscript)
+			def generate_inner(context, fn_name, cell, subscript, callee_ct=nil)
 				source_file = context.source_file
 				header_file = context.header_file
@@ -141,5 +178,6 @@
 				unless ct.is_singleton?
 					if cell == :generic
-						params << "(CELLIDX)extinf"
+						params << "(#{callee_ct.get_global_name}_IDX)extinf"
+						# params << "(CELLIDX)extinf"
 					else
 						# セルのCELLIDXを得る
@@ -233,5 +271,5 @@
 
 						generate_inner context, fn_name,
-							:generic, subscript
+							:generic, subscript, ct
 
 						props.each { |prop|
@@ -445,5 +483,5 @@
 	    # join:: Join : 結合 (declarationがPortであるもの)
 		def validate_join(handler, cell, join)
-        	return !generate_attr_map(handler, cell).nil?
+        return !generate_attr_map(handler, cell).nil?
 		end
 
@@ -872,9 +910,9 @@
     	parse_plugin_arg
     	unless @factory
-    		cdl_error("ASP1003 celltype $1: option factory is not specified",
+    		cdl_error("NTF1003 celltype $1: option factory is not specified",
     			celltype.get_name)
     	end
     	unless @output_file
-    		cdl_error("ASP1003 celltype $1: option output_file is not specified",
+    		cdl_error("NTF1003 celltype $1: option output_file is not specified",
     			celltype.get_name)
     	end
@@ -883,5 +921,5 @@
     def set_factory(template_string)
     	unless @factory.nil?
-    		cdl_error("ASP1003 celltype $1: option factory was specified more than once",
+    		cdl_error("NTF1003 celltype $1: option factory was specified more than once",
     			celltype.get_name)
     	end
@@ -891,5 +929,5 @@
     def set_factory_output_file(output_file)
     	unless @output_file.nil?
-    		cdl_error("ASP1003 celltype $1: option output_file was specified more than once",
+    		cdl_error("NTF1003 celltype $1: option output_file was specified more than once",
     			celltype.get_name)
     	end
@@ -898,5 +936,5 @@
 
     def gen_factory file
-        puts "===== begin #{@celltype.get_name.to_s} plugin ====="
+        # puts "===== begin #{@celltype.get_name.to_s} plugin ====="
 
         kernelCfg = AppFile.open( "#{$gen}/#{@output_file}" )
@@ -922,5 +960,5 @@
 			subst_attr = @celltype.find(name)
 			unless subst_attr
-	    		cdl_error( "ASP1007 celltype $1: additional_param: attribute $2 does not exist.",
+	    		cdl_error( "NTF1007 celltype $1: additional_param: attribute $2 does not exist.",
 	    			@celltype.get_name, name)
 			end
@@ -935,8 +973,9 @@
 
         kernelCfg.close
-        puts "===== end #{@celltype.get_name.to_s} plugin ====="
+        # puts "===== end #{@celltype.get_name.to_s} plugin ====="
     end
 
     def gen_factory_for_cell(kernelCfg, cell)
+      # print "########## gen_factory_for_cell cell=#{cell.get_name}\n"
     	handler_flags = []
     	handler_args = []
@@ -959,12 +998,28 @@
 			when 'false' then ignoreErrors = false
 			else
-				cdl_warning( "ASP1005 cell $1: unrecognized value '$2' specified for ignoreErrors",
+				cdl_warning2( cell.get_locale, "NTF1005 cell $1: unrecognized value '$2' specified for ignoreErrors",
 					cell.get_name, ignoreErrors )
 				ignoreErrors = false
 		end
 
+    # ドメイン指定用文字列
+    pre_text  = ""
+    post_text = "\n"
+    indent    = ""
+ 
     	[EVENT_HANDLER, ERROR_HANDLER].each { |handler|
     		# 呼び口の結合を取得
     		call_join = cell.get_join_list.get_item(handler.call_port_name.to_sym)
+        domain_root = cell.get_region.get_domain_root
+        if cell.get_region.get_domain_root.get_domain_type then
+          # print "cell=#{cell.get_name} domain_root=#{domain_root.get_name} domain_type=#{domain_root.get_domain_type.get_name} domain_option=#{domain_root.get_domain_type.get_option}\n"
+        else
+          # print "cell=#{cell.get_name} domain_root=#{cell.get_region.get_domain_root.get_name}\n"
+        end
+        if call_join
+          # print "validate_join: hanlder=#{handler.class.name} cell=#{cell.get_name} join=#{call_join.get_name} rhs_cell=#{call_join.get_cell}\n"
+        else
+          # print "validate_join: hanlder=#{handler.class.name} cell=#{cell.get_name}\n"
+        end
 
 	    	# ハンドラタイプを判別する
@@ -974,10 +1029,59 @@
 
 	    	if matches.length == 0
-	    		cdl_error( "ASP1001 cell $1: no matching handler type found for $2", cell.get_name, handler.call_port_name )
+	    		cdl_error2( cell.get_locale, "NTF1001 cell $1: no matching handler type found for $2", cell.get_name, handler.call_port_name )
 	    		next
-	    	end
+        end
 
 			# 最初に見つかった有効なハンドラタイプを使用
 	    	ht = matches[0]
+
+      # ドメインプラグインが指定されている場合、所属ドメインのチェック
+      domain_root = cell.get_region.get_domain_root
+      if domain_root.get_domain_type then
+        if domain_root.get_domain_type.get_name == :HRP then
+          option = domain_root.get_domain_type.get_option
+          matches.each{ |match|
+            # p "match:#{match}"
+            case match
+            when ActivateTaskHandlerType,       WakeUpTaskHandlerType,
+                 SetVariableHandlerType,        SetVariableToErrorCodeHandlerType,
+ 		             IncrementVariableHandlerType,  SignalSemaphoreHandlerType, 
+		             SetEventflagHandlerType,       SendToDataqueueHandlerType,
+		             SendErrorCodeToDataqueueHandlerType
+              if option == "OutOfDomain" then
+                cdl_error2( cell.get_locale, "NTF9999: NotifierPlugin: $1 cannot be placed out of domain", cell.get_name )
+              elsif call_join.get_cell.get_region.get_domain_root == nil ||
+                    call_join.get_cell.get_region.get_domain_root != domain_root then
+                cdl_error2( cell.get_locale, "NTF9999: NotifierPlugin: $1 and $2 must be placed in same domain", cell.get_name, call_join.get_cell.get_name )
+              end
+              dbgPrint "#{self.class.name}: match pattern 1.\n"
+            when UserHandlerType
+              if option != "kernel" then
+                cdl_error2( cell.get_locale, "NTF9999: NotifierPlugin: $1 can be placed in kernel domain only, because notify target is handler", cell.get_name )
+              elsif call_join.get_cell.get_region.get_domain_root == nil ||
+                    call_join.get_cell.get_region.get_domain_root != domain_root then
+                cdl_error2( cell.get_locale, "NTF9999: NotifierPlugin: $1 and $2 must be placed in same domain", cell.get_name, call_join.get_cell.get_name )
+              end
+              dbgPrint "#{self.class.name}: match pattern 2.\n"
+		        when NullHandlerType.new  # エラー通知を指定していない
+              dbgPrint "#{self.class.name}: match pattern 3.\n"
+            end
+          }
+
+          # if cell.get_region.get_param == :KERNEL_DOMAIN
+          if option == "kernel"
+            pre_text  = "KERNEL_DOMAIN{\n"
+            post_text = "}\n"
+            indent    =  "\t"
+          elsif option != "OutOfDomain" then
+            pre_text  = "DOMAIN(#{domain_root.get_name.to_s}){\n"
+            post_text = "}\n"
+            indent    =  "\t"
+          end
+        else
+          cdl_error( "NTF9999: NotifierPlugin: unknown domain type $1", domain_root.get_domain_type.get_name )
+        end
+
+      end
 
 			# 通知ハンドラで「エラーが発生するはずがない」のに「エラーハンドラが指定されている」
@@ -986,9 +1090,9 @@
 			#  なため、検出は行わない。)
     		if handler == ERROR_HANDLER && !ht.is_a?(NullHandlerType) && !event_handler_might_fail
-	    		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.",
+	    		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.",
 	    			cell.get_name, handler_flag)
     		end
     		if handler == ERROR_HANDLER && ht.is_a?(NullHandlerType) && event_handler_might_fail && !ignoreErrors
-	    		cdl_warning( "ASP1006 cell $1: handler type $2 which might raise an error was inferred for the normal notificaton handler, but an error notification handler was not specified.",
+	    		cdl_warning2( cell.get_locale, "NTF1006 cell $1: handler type $2 which might raise an error was inferred for the normal notificaton handler, but an error notification handler was not specified.",
 	    			cell.get_name, handler_flag)
     		end
@@ -1057,11 +1161,33 @@
 			# $id$等の置換
 			cell.get_celltype.subst_name(subst, name_array)
-    	}
-
-    	# 出力
-    	kernelCfg.puts text
-
-    end
-    private :gen_factory_for_cell
+      }
+
+     # 出力 (CRE_xxx)
+     kernelCfg.print pre_text
+     kernelCfg.print indent, text, "\n"
+     gen_sac kernelCfg, cell, indent
+     kernelCfg.print post_text
+   end
+
+   def gen_sac file, cell, indent
+     domain_root = cell.get_region.get_domain_root
+     if domain_root.get_domain_type then
+       id = (cell.get_attr_initializer :id).to_s
+                 name_array = cell.get_celltype.get_name_array(cell)
+       case cell.get_celltype.get_name
+       when :tCyclicNotifier
+         obj_type = "CYC"
+       when :tAlarmNotifier
+         obj_type = "ALM"
+       else
+         raise "NotifierPlugin: unknown celltype #{cell.get_celltype.get_name}"
+       end
+       id = cell.get_celltype.subst_name(id, name_array)
+       # p obj_type
+       # p HRPPlugin.get_sac_str cell
+       file.print indent, "SAC_#{obj_type}( #{id}, #{HRPPlugin.get_sac_str cell} );\n"
+     end
+   end
+   private :gen_factory_for_cell
 
 end
