# -*- coding: utf-8 -*- # # TECS Generator # Generator for TOPPERS Embedded Component System # # Copyright (C) 2017-2018 by TOPPERS Project #-- # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー # スコード中に含まれていること. # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 # の無保証規定を掲載すること. # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ # と. # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 # 作権表示,この利用条件および下記の無保証規定を掲載すること. # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに # 報告すること. # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを # 免責すること. # # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ # の責任を負わない. # # $Id$ #++ # TECS 情報セルの生成 module TECSInfo # region は Link root のこと def self.print_info f, region # p "region: "+ region.get_name.to_s nest = region.gen_region_str_pre f indent0 = " " * nest indent = " " * ( nest + 1 ) f.print < 0 then f.print "\n#{indent} /* SIGNATURE info */\n" end @signature_list.each{ |sig| f.print < 0 then f.print "\n#{indent} /* CELLTYPE info */\n" end @celltype_list.each{ |ct| if ct.get_cell_list.length > 0 then f.print < 0 then f.print "\n#{indent} /* NAMESPACE info */\n" end @namespace_list.each{ |ns| if ns.instance_of? Namespace then f.print < 0 then ct.print_info f, indent end } @namespace_list.each { |ns| if ns.instance_of? Namespace then # region を含めない ns.print_info_ns f, indent end } end def self.print_info( f, indent ) @@root_namespace.print_info_ns f, indent end #=== Namespace# 構造体メンバーのオフセット定義 def print_struct_define f f.print "\n/***** Offset of members of structures *****/\n" @struct_tag_list.get_items.each{ |tag, sttype| # print "sttype: #{tag.get_name} #{sttype}\n" tag.get_members_decl.get_items.each{ |decl| f.printf "#define OFFSET_OF_%-30s (%s)\n", "#{tag.get_ID_str}_#{decl.get_name}", "(uint32_t)(intptr_t)&(((#{tag.get_type_str}#{tag.get_type_str_post}*)0)->#{decl.get_name})" f.printf "#define PLACE_OF_%-30s (%s)\n", "#{tag.get_ID_str}_#{decl.get_name}", "VARDECL_PLACE_STRUCT" } } end def print_celltype_define_offset f @celltype_list.each { |ct| if ct.get_cell_list.length > 0 then ct.print_define_offset f end } @namespace_list.each { |ns| if ns.instance_of? Namespace then # region を含めない ns.print_celltype_define_offset f end } end def print_celltype_define f @celltype_list.each { |ct| if ct.get_cell_list.length > 0 then ct.print_celltype_define f end } @namespace_list.each { |ns| if ns.instance_of? Namespace then # region を含めない ns.print_celltype_define f end } end def print_call_define f @celltype_list.each { |ct| if ct.get_cell_list.length > 0 then ct.print_call_define f end } @namespace_list.each { |ns| if ns.instance_of? Namespace then # region を含めない ns.print_call_define f end } end def print_entry_define f @celltype_list.each { |ct| if ct.get_cell_list.length > 0 then ct.print_entry_define f end } @namespace_list.each { |ns| if ns.instance_of? Namespace then # region を含めない ns.print_entry_define f end } end end class Region def print_info_region_sub f, indent if get_link_root == self then name = "_LinkRoot" else name = @global_name end # p "region:#{get_name}" f.print "\n#{indent}/*** #{get_namespace_path} region information cell ***/\n" f.print < 0 then f.print <#{decl.get_name})" f.printf "#define PLACE_OF_%-30s VARDECL_PLACE_%s\n", "#{@global_name}_#{decl.get_name}", place } else f.print < 0 then f.printf "\n#include \"#{@global_name}_tecsgen.h\"\n" f.printf "#define %-50s (#{@idx_is_id_act})\n", "#{@global_name}__IDX_is_ID_act" f.printf "#define %-50s (#{size_CB})\n", "#{@global_name}__sizeOfCB" f.printf "#define %-50s (#{size_INIB})\n", "#{@global_name}__sizeOfINIB" f.printf "#define %-30s (%d)\n", "#{@global_name}__NCELLINLINKUNIT", @n_cell_gen else f.printf "#define %-50s (false)\n", "#{@global_name}__IDX_is_ID_act" f.printf "#define %-50s (0)\n", "#{@global_name}__sizeOfCB" f.printf "#define %-50s (0)\n", "#{@global_name}__sizeOfINIB" f.printf "#define %-30s (%d)\n", "#{@global_name}__NCELLINLINKUNIT", @n_cell_gen end end def print_call_define f if @n_cell_gen > 0 then f.print < __ # * => _Ptr_ # [] => _Array_ # Descriptor() => Descriptor_of_ def get_ID_str # puts "get_ID_str: #{self.class.name}" if kind_of? PtrType then str = get_referto.get_ID_str + "_Ptr_" elsif kind_of? ArrayType then str = get_type.get_ID_str + "_Array" + get_subscript.eval_const( nil ).to_s + "_" elsif kind_of? StructType then str = "struct #{@tag}" elsif kind_of? DescriptorType then str = "Descriptor_of_" + get_signature.get_global_name.to_s else str = get_type_str + get_type_str_post end # p "before: #{str}" str.gsub!( / /, "__" ) # p "after: #{str}" return str end end