- Timestamp:
- Apr 5, 2019, 9:26:53 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/core/tecsinfo.rb
r352 r374 4 4 # Generator for TOPPERS Embedded Component System 5 5 # 6 # Copyright (C) 2017 by TOPPERS Project6 # Copyright (C) 2017-2018 by TOPPERS Project 7 7 #-- 8 8 # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ … … 49 49 #{indent0}region rTECSInfo { 50 50 EOT 51 # mikan 全部生成するのではなく、region 下のセルのセルタイプと、そこから参照されるシグニチャ、セルタイプに限定して出力する. 51 Type.reset_print_info 52 53 # mikan 全部生成するのではなく、region 下のセルのセルタイプと、そこから参照されるシグニチャ、セルタイプに限定して出力すべき 52 54 # しかし、意味解析後に出力するため、これは容易ではない.最適化とコード生成は、リンクルートごとに行われる. 53 55 Namespace.print_info f, indent … … 149 151 "#{tag.get_ID_str}_#{decl.get_name}", 150 152 "(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" 151 156 } 152 157 } … … 213 218 name = @global_name 214 219 end 220 # p "region:#{get_name}" 215 221 f.print "\n#{indent}/*** #{get_namespace_path} region information cell ***/\n" 216 222 f.print <<EOT … … 219 225 EOT 220 226 @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" 222 230 f.print "#{indent} cCellInfo[] = #{cell.get_global_name}CellInfo.eCellInfo;\n" 223 231 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 224 237 } 225 238 f.print "#{indent}};\n" 226 239 @cell_list.each{ |cell| 227 cell.print_info f, indent 240 if ! cell.exclude_info? then 241 cell.print_info f, indent 242 end 228 243 } 229 244 end … … 256 271 ct_list = {} 257 272 @cell_list.each{ |cell| 273 next if cell.exclude_info_factory? 258 274 ct_list[ cell.get_celltype ] = true 259 275 } … … 264 280 f.print "\n" 265 281 @cell_list.each{ |cell| 282 next if cell.exclude_info_factory? 266 283 name_array = cell.get_celltype.get_name_array cell 267 284 if cell.get_celltype.has_CB? 268 285 cb = "(void*)#{name_array[8]}" 286 cb_proto = "extern #{cell.get_celltype.get_global_name}_CB #{name_array[4]};\n" 269 287 else 270 288 cb = "0" 289 cb_proto = "" 271 290 end 272 291 if cell.get_celltype.has_INIB? … … 277 296 inib_proto = "" 278 297 end 279 if cell.get_global_name != :rTECSInfo_TECSInfoSubthen298 if ! cell.exclude_info_factory? then 280 299 f.print <<EOT 281 # define #{cell.get_global_name}__CBP #{cb}300 #{cb_proto}#define #{cell.get_global_name}__CBP #{cb} 282 301 #{inib_proto}#define #{cell.get_global_name}__INIBP #{inib} 283 302 EOT … … 287 306 if region.instance_of? Region then 288 307 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 289 335 end 290 336 } … … 342 388 } 343 389 @attribute.each{ |decl| 344 decl.print_info f, @global_name, indent 390 decl.print_info f, @global_name, indent, :DECLTYPE_ATTR 345 391 } 346 392 @var.each{ |decl| 347 decl.print_info f, @global_name, indent 393 decl.print_info f, @global_name, indent, :DECLTYPE_VAR 348 394 } 349 395 end … … 364 410 if ! decl.is_omit? then 365 411 offset = "(uint32_t)(intptr_t)&(((#{@global_name}_#{inib_cb}*)0)->#{decl.get_name})" 412 place = inib_cb 366 413 else 367 414 offset = "0xffffffff" 415 place = "NON" 368 416 end 369 417 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 370 419 } 371 420 @var.each{ |decl| 372 if decl.get_size_is then421 if decl.get_size_is && has_INIB? then 373 422 inib_cb = "INIB" 374 423 else 375 424 inib_cb = "CB" 376 425 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 378 429 } 379 430 else … … 385 436 @attribute.each{ |decl| 386 437 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}" 387 439 } 388 440 @var.each{ |decl| 389 441 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}" 390 443 } 391 444 end … … 404 457 end 405 458 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 411 471 end 412 472 … … 446 506 end 447 507 end 448 if ( port.is_VMT_useless? && port.is_cell_unique? ) || @n_cell_gen == 0 then508 if ( port.is_VMT_useless? && port.is_cell_unique? ) || port.is_omit? || @n_cell_gen == 0 then 449 509 offset = "0xffffffff" 450 510 else … … 525 585 class Cell 526 586 def print_info f, indent 527 if @global_name == :rTECSInfo_TECSInfoSubthen587 if exclude_info? then 528 588 return 529 589 end … … 536 596 #{indent} inibp = C_EXP( \"#{@global_name}__INIBP\" ); 537 597 #{indent} cCelltypeInfo = #{@celltype.get_global_name}CelltypeInfo.eCelltypeInfo; 538 #{indent}}; 539 EOT 598 EOT 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; 604 EOT 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} }; 628 EOT 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 540 661 end 541 662 end … … 569 690 f.print <<EOT 570 691 #{indent}cell nTECSInfo::tFunctionInfo #{sig_name}_#{func_name}FunctionInfo { 571 #{indent} name = "#{ @owner.get_global_name}_#{@name}";692 #{indent} name = "#{get_name}"; 572 693 #{indent} bOneway = #{is_oneway?}; 573 694 EOT … … 625 746 626 747 class Decl 627 def print_info f, parent_ID_str, indent 748 def print_info f, parent_ID_str, indent, decl_type 628 749 if @size_is then 629 750 size = "\"mikan\""; … … 635 756 #{indent} name = "#{get_name}"; 636 757 #{indent} sizeIsExpr = #{size}; 637 #{indent} declType = DECLTYPE_STMEMBER;758 #{indent} declType = #{decl_type}; 638 759 #{indent} offset = C_EXP( "OFFSET_OF_#{parent_ID_str}_#{get_name}" ); 760 #{indent} place = C_EXP( "PLACE_OF_#{parent_ID_str}_#{get_name}" ); 639 761 #{indent} cTypeInfo = #{get_type.get_ID_str}TypeInfo.eTypeInfo; 640 762 #{indent}}; … … 646 768 class Type 647 769 @@typeinfo_printed = {} 770 771 def self.reset_print_info 772 @@typeinfo_printed = {} 773 end 774 648 775 def print_info f, indent 649 776 # Type の info は、最後にまとめて出力するので、ここでは記録するだけ … … 661 788 elsif self.kind_of? StructType then 662 789 get_members_decl.get_items.each{ |decl| 663 decl. get_type.print_info f, indent790 decl.print_info f, get_ID_str, indent, :DECLTYPE_STMEMBER 664 791 } 665 792 end … … 673 800 674 801 def print_info_post f, indent 675 bit_size = get_bit_size676 if bit_size <= 0 then677 bit_size = "C_EXP( \"sizeof(#{get_type_str}#{get_type_str_post})\" )"678 end679 802 if self.class.superclass == Type then # 親クラスが Type の場合 types.rb のクラス 680 803 type_name = self.class.name … … 689 812 #{indent} name = "#{get_type_str}#{get_type_str_post}"; 690 813 #{indent} typeKind = TECSTypeKind_#{type_name}; 691 #{indent} size = #{bit_size};814 #{indent} size = C_EXP( "sizeof(#{get_type_str}#{get_type_str_post})" ); 692 815 #{indent} b_const = #{is_const?}; 693 816 #{indent} b_volatile = #{is_volatile?}; 694 817 EOT 695 818 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" 697 820 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" 699 822 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" 701 824 elsif self.kind_of? StructType then 702 825 get_members_decl.get_items.each{ |decl| 703 f.print "#{indent} c TypeInfo[] = #{decl.get_type.get_ID_str}TypeInfo.eTypeInfo;\n"826 f.print "#{indent} cVarDeclInfo[] = #{get_ID_str}_#{decl.get_name}VarDeclInfo.eVarDeclInfo;\n" 704 827 } 705 828 elsif self.kind_of? DescriptorType then
Note:
See TracChangeset
for help on using the changeset viewer.