Ignore:
Timestamp:
Apr 5, 2019, 9:26:53 PM (5 years ago)
Author:
coas-nagasima
Message:

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/core/tecsinfo.rb

    r352 r374  
    44#      Generator for TOPPERS Embedded Component System
    55
    6 #   Copyright (C) 2017 by TOPPERS Project
     6#   Copyright (C) 2017-2018 by TOPPERS Project
    77#--
    88#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     
    4949#{indent0}region rTECSInfo {
    5050EOT
    51     # mikan 全部生成するのではなく、region 下のセルのセルタイプと、そこから参照されるシグニチャ、セルタイプに限定して出力する.
     51    Type.reset_print_info
     52
     53    # mikan 全部生成するのではなく、region 下のセルのセルタイプと、そこから参照されるシグニチャ、セルタイプに限定して出力すべき
    5254    # しかし、意味解析後に出力するため、これは容易ではない.最適化とコード生成は、リンクルートごとに行われる.
    5355    Namespace.print_info f, indent
     
    149151                 "#{tag.get_ID_str}_#{decl.get_name}",
    150152                 "(uint32_t)(intptr_t)&(((#{tag.get_type_str}#{tag.get_type_str_post}*)0)->#{decl.get_name})"
     153        f.printf "#define PLACE_OF_%-30s  (%s)\n",
     154                 "#{tag.get_ID_str}_#{decl.get_name}",
     155                 "VARDECL_PLACE_STRUCT"
    151156      }
    152157    }
     
    213218      name = @global_name
    214219    end
     220    # p "region:#{get_name}"
    215221    f.print "\n#{indent}/*** #{get_namespace_path} region information cell ***/\n"
    216222    f.print <<EOT
     
    219225EOT
    220226    @cell_list.each{ |cell|
    221       if cell.get_global_name != :rTECSInfo_TECSInfoSub then
     227        # print "cell class="+cell.get_celltype.class.name+", " + cell.get_celltype.get_name.to_s + " 1\n"
     228      if ! cell.exclude_info? then
     229        # print "cell class="+cell.get_celltype.class.name+", " + cell.get_celltype.get_name.to_s + " 2\n"
    222230        f.print "#{indent}    cCellInfo[] = #{cell.get_global_name}CellInfo.eCellInfo;\n"
    223231      end
     232    }
     233    @namespace_list.each { |region|
     234      if region.instance_of? Region then
     235        f.print "#{indent}    cRegionInfo[] = #{region.get_global_name}RegionInfo.eRegionInfo;\n"
     236       end
    224237    }
    225238    f.print "#{indent}};\n"
    226239    @cell_list.each{ |cell|
    227       cell.print_info f, indent
     240      if ! cell.exclude_info? then
     241        cell.print_info f, indent
     242      end
    228243    }
    229244  end
     
    256271    ct_list = {}
    257272    @cell_list.each{ |cell|
     273      next if cell.exclude_info_factory?
    258274      ct_list[ cell.get_celltype ] = true
    259275    }
     
    264280    f.print "\n"
    265281    @cell_list.each{ |cell|
     282      next if cell.exclude_info_factory?
    266283      name_array = cell.get_celltype.get_name_array cell
    267284      if cell.get_celltype.has_CB?
    268285        cb = "(void*)#{name_array[8]}"
     286        cb_proto = "extern #{cell.get_celltype.get_global_name}_CB #{name_array[4]};\n"
    269287      else
    270288        cb = "0"
     289        cb_proto = ""
    271290      end
    272291      if cell.get_celltype.has_INIB?
     
    277296        inib_proto = ""
    278297      end
    279       if cell.get_global_name != :rTECSInfo_TECSInfoSub then
     298      if ! cell.exclude_info_factory? then
    280299        f.print <<EOT
    281 #define  #{cell.get_global_name}__CBP   #{cb}
     300#{cb_proto}#define  #{cell.get_global_name}__CBP   #{cb}
    282301#{inib_proto}#define  #{cell.get_global_name}__INIBP #{inib}
    283302EOT
     
    287306      if region.instance_of? Region then
    288307        region.print_cell_define f
     308      end
     309    }
     310  end
     311
     312  def print_entry_descriptor_define f
     313    @cell_list.each{ |cell|
     314      next if cell.exclude_info_factory?
     315
     316      signatures = {}
     317      cell.get_celltype.get_port_list.each{ |port|
     318        next if port.get_port_type != :ENTRY
     319
     320        if signatures[ port.get_signature ] == nil then
     321          f.print "#include \"#{port.get_signature.get_global_name}_tecsgen.h\"\n"
     322        end
     323        if cell.get_celltype.get_global_name == :nTECSInfo_tRawEntryDescriptorInfo then
     324          f.print "const struct tag_#{cell.get_celltype.get_global_name}_#{port.get_name}_DES "
     325          f.print "#{cell.get_global_name}_#{port.get_name}_des;\n"
     326        else
     327          f.print "extern struct tag_#{port.get_signature.get_global_name}_VDES "
     328          f.print "#{cell.get_global_name}_#{port.get_name}_des;\n"
     329        end
     330      }
     331    }
     332    @namespace_list.each { |region|
     333      if region.instance_of? Region then
     334        region.print_entry_descriptor_define f
    289335      end
    290336    }
     
    342388    }
    343389    @attribute.each{ |decl|
    344       decl.print_info f, @global_name, indent
     390      decl.print_info f, @global_name, indent, :DECLTYPE_ATTR
    345391    }
    346392    @var.each{ |decl|
    347       decl.print_info f, @global_name, indent
     393      decl.print_info f, @global_name, indent, :DECLTYPE_VAR
    348394    }
    349395  end
     
    364410        if ! decl.is_omit? then
    365411          offset = "(uint32_t)(intptr_t)&(((#{@global_name}_#{inib_cb}*)0)->#{decl.get_name})"
     412          place = inib_cb
    366413        else
    367414          offset = "0xffffffff"
     415          place = "NON"
    368416        end
    369417        f.printf "#define OFFSET_OF_%-30s  (%s)\n", "#{@global_name}_#{decl.get_name}", offset
     418        f.printf "#define PLACE_OF_%-30s  VARDECL_PLACE_%s\n", "#{@global_name}_#{decl.get_name}", place
    370419      }
    371420      @var.each{ |decl|
    372         if decl.get_size_is then
     421        if decl.get_size_is && has_INIB? then
    373422          inib_cb = "INIB"
    374423        else
    375424          inib_cb = "CB"
    376425        end
    377           f.printf "#define OFFSET_OF_%-30s  (%s)\n", "#{@global_name}_#{decl.get_name}", "(uint32_t)(intptr_t)&(((#{@global_name}_#{inib_cb}*)0)->#{decl.get_name})"
     426        place = inib_cb
     427        f.printf "#define OFFSET_OF_%-30s  (%s)\n", "#{@global_name}_#{decl.get_name}", "(uint32_t)(intptr_t)&(((#{@global_name}_#{inib_cb}*)0)->#{decl.get_name})"
     428        f.printf "#define PLACE_OF_%-30s  VARDECL_PLACE_%s\n", "#{@global_name}_#{decl.get_name}", place
    378429      }
    379430    else
     
    385436      @attribute.each{ |decl|
    386437        f.printf "#define OFFSET_OF_%-30s  (%s)\n", "#{@global_name}_#{decl.get_name}", "0xffffffff"
     438        f.printf "#define PLACE_OF_%-30s   VARDECL_PLACE_NON\n", "#{@global_name}_#{decl.get_name}"
    387439      }
    388440      @var.each{ |decl|
    389441        f.printf "#define OFFSET_OF_%-30s  (%s)\n", "#{@global_name}_#{decl.get_name}", "0xffffffff"
     442        f.printf "#define PLACE_OF_%-30s   VARDECL_PLACE_NON\n", "#{@global_name}_#{decl.get_name}"
    390443      }
    391444    end
     
    404457    end
    405458
    406     f.printf "\n#include \"#{@global_name}_tecsgen.h\"\n"
    407     f.printf "#define %-50s (#{@idx_is_id_act})\n",     "#{@global_name}__IDX_is_ID_act"
    408     f.printf "#define %-50s (#{size_CB})\n",            "#{@global_name}__sizeOfCB"
    409     f.printf "#define %-50s (#{size_INIB})\n",          "#{@global_name}__sizeOfINIB"
    410     f.printf "#define %-30s (%d)\n", "#{@global_name}__NCELLINLINKUNIT", @n_cell_gen
     459    if @n_cell_gen > 0 then
     460      f.printf "\n#include \"#{@global_name}_tecsgen.h\"\n"
     461      f.printf "#define %-50s (#{@idx_is_id_act})\n",     "#{@global_name}__IDX_is_ID_act"
     462      f.printf "#define %-50s (#{size_CB})\n",            "#{@global_name}__sizeOfCB"
     463      f.printf "#define %-50s (#{size_INIB})\n",          "#{@global_name}__sizeOfINIB"
     464      f.printf "#define %-30s (%d)\n", "#{@global_name}__NCELLINLINKUNIT", @n_cell_gen
     465    else
     466      f.printf "#define %-50s (false)\n",                 "#{@global_name}__IDX_is_ID_act"
     467      f.printf "#define %-50s (0)\n",                     "#{@global_name}__sizeOfCB"
     468      f.printf "#define %-50s (0)\n",                     "#{@global_name}__sizeOfINIB"
     469      f.printf "#define %-30s (%d)\n", "#{@global_name}__NCELLINLINKUNIT", @n_cell_gen
     470    end
    411471  end
    412472
     
    446506        end
    447507      end
    448       if ( port.is_VMT_useless? && port.is_cell_unique? ) || @n_cell_gen == 0 then
     508      if ( port.is_VMT_useless? && port.is_cell_unique? ) || port.is_omit? || @n_cell_gen == 0 then
    449509        offset = "0xffffffff"
    450510      else
     
    525585class Cell
    526586  def print_info f, indent
    527     if @global_name == :rTECSInfo_TECSInfoSub then
     587    if exclude_info? then
    528588      return
    529589    end
     
    536596#{indent}    inibp           = C_EXP( \"#{@global_name}__INIBP\" );
    537597#{indent}    cCelltypeInfo   = #{@celltype.get_global_name}CelltypeInfo.eCelltypeInfo;
    538 #{indent}};
    539 EOT
     598EOT
     599    @celltype.get_port_list.each{ |port|
     600      next if port.get_port_type != :ENTRY
     601
     602      f.print <<EOT
     603#{indent}    cRawEntryDescriptor[] = #{@global_name}_#{port.get_name}RawEntryDescriptorInfo.eRawEntryDescriptor;
     604EOT
     605    }
     606    f.print "#{indent}};\n"
     607
     608    # RawEntryDescriptorInfo cells
     609    @celltype.get_port_list.each{ |port|
     610      next if port.get_port_type != :ENTRY
     611
     612      size = port.get_array_size
     613      if size == nil then
     614        size = 1
     615      elsif size == "[]" then
     616        size = @entry_array_max_subscript[ port ]
     617      end
     618      if ! port.is_omit? then
     619        red = "C_EXP( \"&#{@global_name}_#{port.get_name}_des\" )"
     620      else
     621        red = "(void *)0"
     622      end
     623      # mikan 受け口配列
     624      f.print <<EOT
     625#{indent}cell nTECSInfo::tRawEntryDescriptorInfo #{@global_name}_#{port.get_name}RawEntryDescriptorInfo {
     626#{indent}   size = #{size};
     627#{indent}   rawEntryDescriptor = { #{red} };
     628EOT
     629#  #{indent}   cEntryInfo = #{@celltype.get_global_name}_#{port.get_name}EntryInfo.eEntryInfo;
     630      f.print "#{indent}};\n"
     631    }
     632  end
     633
     634  def exclude_info?
     635    # print "exclude_info?: name=" + get_name.to_s
     636    if @celltype == nil ||
     637       is_of_composite? ||
     638       @celltype.get_global_name == :nTECSInfo_tTECSInfoSub ||
     639       post_code_generated? ||
     640       @b_defined == false then
     641      # print ": true celltype_is_of_composite=#{is_of_composite?} celltype_name=#{@celltype.get_global_name} celltype.need_generate=#{@celltype.need_generate?}\n"
     642      return true
     643    else
     644      # print ": false\n"
     645      return false
     646    end
     647  end
     648
     649  def exclude_info_factory?
     650    # print "exclude_info_factory?: name=" + get_name.to_s
     651    if @celltype == nil ||
     652       is_of_composite? ||
     653       @celltype.get_global_name == :nTECSInfo_tTECSInfoSub ||
     654       ! @celltype.need_generate? then
     655      # print ": true celltype_is_of_composite=#{is_of_composite?} celltype_name=#{@celltype.get_global_name} celltype.need_generate=#{@celltype.need_generate?}\n"
     656      return true
     657    else
     658      # print ": false\n"
     659      return false
     660    end
    540661  end
    541662end
     
    569690    f.print <<EOT
    570691#{indent}cell nTECSInfo::tFunctionInfo #{sig_name}_#{func_name}FunctionInfo {
    571 #{indent}    name            = "#{@owner.get_global_name}_#{@name}";
     692#{indent}    name            = "#{get_name}";
    572693#{indent}    bOneway         = #{is_oneway?};
    573694EOT
     
    625746
    626747class Decl
    627   def print_info f, parent_ID_str, indent
     748  def print_info f, parent_ID_str, indent, decl_type
    628749    if @size_is then
    629750      size = "\"mikan\"";
     
    635756#{indent}    name            = "#{get_name}";
    636757#{indent}    sizeIsExpr      = #{size};
    637 #{indent}    declType        = DECLTYPE_STMEMBER;
     758#{indent}    declType        = #{decl_type};
    638759#{indent}    offset          = C_EXP( "OFFSET_OF_#{parent_ID_str}_#{get_name}" );
     760#{indent}    place           = C_EXP( "PLACE_OF_#{parent_ID_str}_#{get_name}" );
    639761#{indent}    cTypeInfo       = #{get_type.get_ID_str}TypeInfo.eTypeInfo;
    640762#{indent}};
     
    646768class Type
    647769  @@typeinfo_printed = {}
     770
     771  def self.reset_print_info
     772    @@typeinfo_printed = {}
     773  end
     774
    648775  def print_info f, indent
    649776    # Type の info は、最後にまとめて出力するので、ここでは記録するだけ
     
    661788    elsif self.kind_of? StructType then
    662789      get_members_decl.get_items.each{ |decl|
    663         decl.get_type.print_info f, indent
     790        decl.print_info f, get_ID_str, indent, :DECLTYPE_STMEMBER
    664791      }
    665792    end
     
    673800
    674801  def print_info_post f, indent
    675     bit_size = get_bit_size
    676     if bit_size <= 0 then
    677       bit_size = "C_EXP( \"sizeof(#{get_type_str}#{get_type_str_post})\" )"
    678     end
    679802    if self.class.superclass == Type then     # 親クラスが Type の場合 types.rb のクラス
    680803      type_name = self.class.name
     
    689812#{indent}    name           = "#{get_type_str}#{get_type_str_post}";
    690813#{indent}    typeKind       = TECSTypeKind_#{type_name};
    691 #{indent}    size           = #{bit_size};
     814#{indent}    size           = C_EXP( "sizeof(#{get_type_str}#{get_type_str_post})" );
    692815#{indent}    b_const        = #{is_const?};
    693816#{indent}    b_volatile     = #{is_volatile?};
    694817EOT
    695818    if self.kind_of? PtrType then
    696       f.print "#{indent}    cTypeInfo      = #{get_referto.get_ID_str}TypeInfo.eTypeInfo;\n"
     819      f.print "#{indent}    cTypeInfo        = #{get_referto.get_ID_str}TypeInfo.eTypeInfo;\n"
    697820    elsif self.kind_of? ArrayType then
    698       f.print "#{indent}    cTypeInfo      = #{get_type.get_ID_str}TypeInfo.eTypeInfo;\n"
     821      f.print "#{indent}    cTypeInfo        = #{get_type.get_ID_str}TypeInfo.eTypeInfo;\n"
    699822    elsif self.kind_of? DefinedType then
    700       f.print "#{indent}    cTypeInfo      = #{get_type.get_ID_str}TypeInfo.eTypeInfo;\n"
     823      f.print "#{indent}    cTypeInfo        = #{get_type.get_ID_str}TypeInfo.eTypeInfo;\n"
    701824    elsif self.kind_of? StructType then
    702825      get_members_decl.get_items.each{ |decl|
    703         f.print "#{indent}    cTypeInfo[]    = #{decl.get_type.get_ID_str}TypeInfo.eTypeInfo;\n"
     826        f.print "#{indent}    cVarDeclInfo[] = #{get_ID_str}_#{decl.get_name}VarDeclInfo.eVarDeclInfo;\n"
    704827      }
    705828    elsif self.kind_of? DescriptorType then
Note: See TracChangeset for help on using the changeset viewer.