# -*- coding: utf-8 -*- # # TECS Generator # Generator for TOPPERS Embedded Component System # # Copyright (C) 2008-2014 by TOPPERS Project #-- # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー # スコード中に含まれていること. # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 # の無保証規定を掲載すること. # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ # と. # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 # 作権表示,この利用条件および下記の無保証規定を掲載すること. # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに # 報告すること. # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを # 免責すること. # # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ # の責任を負わない. # # $Id$ #++ # mikan through plugin: namespace が考慮されていない # これを利用する場合、以下のように toppers_jsp.cdl sChannel.cdl を指定する必要がある # tecsgen toppers_jsp.cdl sChannel.cdl your_description.cdl # 以下を仮定(制限事項) # 呼び元、呼び先のエンディアン、char, short, int_t, long_t, intptr_t のサイズが同じ # 有符号、無符号でサイズが同じ class SVCManage # TODO: デフォルトの拡張サービスコール分を予約しておく # デフォルトの拡張サービスコール(syslogなど)もコンポーネント化するまで @@id = 20 @@func_ids = {} def self.get_func_id func_name return @@func_ids[ func_name ] end def self.set_func_id func_name @@func_ids[ func_name ] = self.assign_id puts @@func_ids[ func_name ] end def self.include_func_id? func_name return @@func_ids.has_key?( func_name ) end def self.get_id return @@id end def self.set_id id @@id = id end def self.assign_id @@id += 1 return @@id end end # # 拡張サービスコールを用いたドメイン間通信の # throughプラグイン # HRP2ドメインプラグインによって挿入される # class HRP2SVCPlugin < ThroughPlugin #=== RPCPlugin の initialize # 説明は ThroughPlugin (plugin.rb) を参照 @@generated_celltype_header = {} def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, next_cell_port_subscript, signature, celltype, caller_cell ) super @ct_name_body = "#{@ct_name}SVCBody_#{@next_cell.get_name}_#{@next_cell_port_name}".to_sym @ct_name = "#{@ct_name}SVCCaller_#{@next_cell.get_name}_#{@next_cell_port_name}".to_sym @cell_name_body = "#{@cell_name}SVCBody".to_sym @cell_name = "#{@cell_name}SVCCaller".to_sym puts "%%%% " p @next_cell.get_name p @caller_cell.get_name end #=== NamespacePath を得る # 生成するセルの namespace path を生成する def get_cell_namespace_path # nsp = @region.get_namespace.get_namespace_path nsp = @start_region.get_namespace_path return nsp.append( @cell_name ) end def gen_plugin_decl_code( file ) # このセルタイプ(同じシグニチャ)は既に生成されているか? if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype) if @@generated_celltype[ @ct_name_body ] == nil then @@generated_celltype[ @ct_name_body ] = [ self ] file2 = CFile.open( "#{$gen}/#{@ct_name_body}.cdl", "w" ) file2.print < composite.#{@call_port_name}; }; composite.#{@entry_port_name} => #{@cell_name}.#{@entry_port_name}; }; =end end #=== through cell コードを生成 # # def gen_through_cell_code( file ) #require "HRP2Cache" gen_plugin_decl_code( file ) if !HRP2KernelObjectPlugin.include_celltype?(@next_cell.get_celltype) # セルを探す # path =["::",@next_cell.get_name] # mikan namespace # cell = Namespace.find( path ) # cell = Namespace.find( @next_cell.get_namespace_path ) ##### クライアント側のセルの生成 ##### # file.print "[domain(HRP2, \"trusted\")]" nest = @start_region.gen_region_str_pre file nest_str = " " * nest # クライアント側チャンネルの生成 # 拡張サービスコール呼出し file.print <]# # * #[<...>]# から #[]# で囲まれたコメントは編集しないでください # * tecsmerge によるマージに使用されます # * # * #[]# */ # # /* プロトタイプ宣言や変数の定義をここに書きます #_PAC_# */ # #include "#{@ct_name_body}_tecsgen.h" # # #ifndef E_OK # #define E_OK 0 /* success */ # #define E_ID (-18) /* illegal ID */ # #endif # # EOT # end if func_type.get_type.kind_of?( VoidType ) then retval_assign = "" retval_return = "" else retval_assign = "retval = (ER_UINT)" retval_return = "retval" end file2.print < 0 then if param.get_direction == :IN then file2.print <