- Timestamp:
- Apr 5, 2019, 9:26:53 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/core/generate.rb
r359 r374 4 4 # Generator for TOPPERS Embedded Component System 5 5 # 6 # Copyright (C) 2008-201 7by TOPPERS Project6 # Copyright (C) 2008-2019 by TOPPERS Project 7 7 #-- 8 8 # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ … … 122 122 123 123 class Namespace 124 @@domain_gen_factory_list = nil 124 125 def generate 125 126 … … 135 136 return 136 137 end 138 if instance_of? Region then 139 @@domain_gen_factory_list = {} # create hash 140 end 137 141 end 138 142 … … 141 145 gen_global_header 142 146 147 if ( instance_of? Region ) && get_domain_type != nil then 148 # p "******************* domain_type: #{get_domain_type.get_name} ****************" 149 domain_type = get_domain_type 150 if @@domain_gen_factory_list[ domain_type ] == nil then 151 @@domain_gen_factory_list[ domain_type ] = self 152 domain_type.gen_factory 153 end 154 end 155 143 156 # signature のコードを生成 144 157 @signature_list.each { |s| … … 455 468 } 456 469 end 457 f.print " rm -f $(CELLTYPE_COBJS) $(TECSGEN_COBJS) $(PLUGIN_COBJS) $(OTHER_OBJS) $(TARGET) #{timestamp}\n"470 f.print " rm -f $(CELLTYPE_COBJS) $(TECSGEN_COBJS) $(PLUGIN_COBJS) $(OTHER_OBJS) $(TARGET) #{timestamp}\n" 458 471 if $generating_region == @@root_namespace then 459 472 f.print " rm -rf $(GEN_DIR)\n" … … 465 478 f.print "tecs : $(PRE_TECSGEN_TARGET) $(TIMESTAMP) $(POST_TECSGEN_TARGET)\n\n" 466 479 f.print "$(TIMESTAMP) : $(TECS_IMPORTS)\n" 467 f.print " $(TECSGEN) #{TECSGEN.subst_tecspath( $arguments, true )}\n "480 f.print " $(TECSGEN) #{TECSGEN.subst_tecspath( $arguments, true )}\n\n" 468 481 # f.print " touch $(TIMESTAMP)\n\n" 469 470 482 else 471 483 f.print "tecs:\n" … … 473 485 end 474 486 487 # tecsflow:, tcflow ターゲット 488 if $generating_region.get_n_cells != 0 || $generating_region == @@root_namespace then 489 f.print "##### TECSFlow targets #####\n" 490 end 491 492 if Region.get_link_roots.length > 1 && $generating_region == @@root_namespace then 493 tecsflow_target = "tecsflow_sub" 494 if $generating_region.get_n_cells > 0 then 495 f.print "tecsflow: tecs tecsflow_sub\n" 496 else 497 f.print "tecsflow:\n" 498 end 499 Region.get_link_roots.each {|region| 500 if region.get_n_cells > 0 then 501 f.print "\tcd #{region.get_global_name}; make tecsflow\n" 502 end 503 } 504 f.print "\n" 505 else 506 tecsflow_target = "tecsflow" 507 end 508 509 if $generating_region.get_n_cells != 0 then 510 f.print "#{tecsflow_target} : $(GEN_DIR)/tecsgen.rbdmp tcflow\n" 511 f.print "\ttecsflow -g $(GEN_DIR)\n\n" 512 f.print "tecsflow_u : $(GEN_DIR)/tecsgen.rbdmp tcflow\n" 513 f.print "\ttecsflow -g $(GEN_DIR) -U\n\n" 514 f.print "$(GEN_DIR)/tecsgen.rbdmp : tecs\n\n" 515 f.print "tcflow : tecs\n" 516 f.print "\tmake tcflow_exec\n\n" 517 f.print "tcflow_exec : $(GEN_DIR)/tcflow.rbdmp\n" 518 f.print "$(GEN_DIR)/tcflow.rbdmp : $(CELLTYPE_SRCS) $(PLUGIN_CELLTYPE_SRCS)\n" 519 f.print "\ttcflow -g $(GEN_DIR) -c '$(CC) -E -DTECSFLOW -DTECSGEN $(CFLAGS) -I ./' $^\n" 520 end 521 522 if $generating_region.get_n_cells != 0 || $generating_region == @@root_namespace then 523 f.print "##### end TECSFlow targets #####\n\n" 524 end 525 526 # generic %.o : %.c 475 527 f.print "# generic target for objs\n" 476 528 f.print "$(_TECS_OBJ_DIR)%.o : %.#{$c_suffix}\n" … … 492 544 ### Makefile.tecsgen の生成 493 545 f = AppFile.open( "#{$gen}/Makefile.tecsgen" ) 546 547 f.print <<EOT 548 # generated automatically by tecsgen. 549 # This file is not intended to modify. 550 # 551 # Makefile variables below are defined. 552 # TECS_IMPORT_CDLS .cdl files improted by import statement 553 # SIGNATURE_HEADERS .h files of signature 554 # CELLTYPE_TECSGEN_HEADERS .h files of celltype 555 # CELLTYPE_FACTORY_HEADERS .h files of celltype's factory 556 # TECS_HEADERS summary of .h files above 557 # TECS_INLINE_HEADERS .h files of celltype inline header 558 # PLUGIN_INLINE_HEADERS .h files of plugin generated inline header 559 # 560 # TECS_COBJS .o files of TECS 561 # = $(TECSGEN_COBJS)+$(PLUGIN_COBJS)+$(CELLTYPE_COBJS) 562 # = $(TECS_KERNEL_COBJS)+$(TECS_KERNEL_COBJS)+$(TECS_OUTOFDOMAIN_COBJS) 563 # = $(TECSGEN_domain_COBJS)+$(PLUGIN_domain_COBJS)+$(CELLTYPE_domain_COBJS) for each domain 564 # 565 # TECSGEN_COBJS .o files of celltype_tecsgen.c 566 # CELLTYPE_COBJS .o files of celltype.c (celltype code) 567 # PLUGIN_COBJS .o files of plugin generated .c files 568 # 569 # TECSGEN_SRCS .c files of celltype_tecsgen.c 570 # CELLTYPE_SRCS .c files of celltype.c (celltype code) 571 # PLUGIN_SRCS .c files of plugin generated 572 # PLUGIN_CELLTYPE_SRCS .c files of plugin generated celltype.c (celltype code) 573 # PLUGIN_TECSGEN_SRCS .c files of plugin generated celltype_tecsgen.c 574 # 575 # Variables for domain 576 # TECS_DOMAINS domain names 577 # TECS_KERNEL_COBJS .o files of kernel domain (tecsgen, celltype, plugin) 578 # TECS_USER_COBJS .o files of user domain (tecsgen, celltype, plugin) 579 # TECS_OUTOFDOMAIN_COBJS .o files of OutOfDomain (tecsgen, celltype, plugin) 580 # TECSGEN_domain_COBJS .o files of celltype_tecsgen.c files for each domain 581 # PLUGIN_domain_COBJS .o files of plugin generated .c files for each domain 582 # CELLTYPE_domain_COBJS .o files of celltype.c files for each domain 583 # TECSGEN_domain_SRCS .c files of celltype_domain_tecsgen.c 584 # PLUGIN_domain_SRCS .c files of plugin generated .c files for each domain 585 # CELLTYPE_domain_SRCS .c files of celltype.c files for each domain 586 587 EOT 494 588 495 589 f.print( "TECS_IMPORT_CDLS =" ) … … 546 640 DomainType.get_domain_regions.each{ |dt, regions| 547 641 # domain_type は一つのノードには、一つしかないので、このループは、必ず一回しか回らない 642 ### mikan 複数のノードがあり、異なる domain_type が指定される可能性はある 548 643 domain_regions = regions 549 644 domain_type = dt … … 588 683 f.print( "\n\n" ) 589 684 590 f.print( "# TECS_COBJS: objects from sources which are automatically generated by tecsgen\n" ) 685 f.print( "# TECS_KERNEL_COBJS: objects belong to kernel domain\n" ) 686 f.print( "TECS_KERNEL_COBJS = \\\n" ) 687 domain_regions.each{ |r| 688 if r.get_domain_type.get_kind == :kernel then 689 f.print( " $(TECSGEN#{decideDomainNameProc.call r}_COBJS) \\\n" ) 690 f.print( " $(PLUGIN#{decideDomainNameProc.call r}_COBJS) \\\n" ) 691 f.print( " $(CELLTYPE#{decideDomainNameProc.call r}_COBJS) \\\n" ) 692 end 693 } 694 f.print( "# TECS_KERNEL_COBJS terminator\n\n" ) 695 696 f.print( "# TECS_USER_COBJS: objects belong to user domain\n" ) 697 f.print( "TECS_USER_COBJS = \\\n" ) 698 domain_regions.each{ |r| 699 if r.get_domain_type.get_kind == :user then 700 f.print( " $(TECSGEN#{decideDomainNameProc.call r}_COBJS) \\\n" ) 701 f.print( " $(PLUGIN#{decideDomainNameProc.call r}_COBJS) \\\n" ) 702 f.print( " $(CELLTYPE#{decideDomainNameProc.call r}_COBJS) \\\n" ) 703 end 704 } 705 f.print( "# TECS_USER_COBJS terminator\n\n" ) 706 707 f.print( "# TECS_OUTOFDOMAIN_COBJS: objects belong to OutOfDomain\n" ) 708 f.print( "TECS_OUTOFDOMAIN_COBJS = \\\n" ) 709 domain_regions.each{ |r| 710 if r.get_domain_type.get_kind == :OutOfDomain then 711 f.print( " $(TECSGEN#{decideDomainNameProc.call r}_COBJS) \\\n" ) 712 f.print( " $(PLUGIN#{decideDomainNameProc.call r}_COBJS) \\\n" ) 713 f.print( " $(CELLTYPE#{decideDomainNameProc.call r}_COBJS) \\\n" ) 714 end 715 } 716 f.print( "# TECS_OUTOFDOMAIN_COBJS terminator\n\n" ) 717 718 f.print( "# TECSGEN_COBJS: objects from sources which are automatically generated by tecsgen\n" ) 591 719 f.print( "TECSGEN_COBJS = \\\n" ) 592 720 domain_regions.each{ |r| … … 622 750 623 751 ### 624 f.print( "# TECS _COBJS: objects from sources which are automatically generated by tecsgen\n" )752 f.print( "# TECSGEN_COBJS: objects from sources which are automatically generated by tecsgen\n" ) 625 753 domain_regions.each{ |r| 626 754 nsp = decideDomainNameProc.call( r ) … … 656 784 657 785 f.print( "# PLUGIN_SRCS: sources automatically generated by plugin\n" ) 786 f.print( "PLUGIN_CELLTYPE_SRCS = \\\n" ) 658 787 domain_regions.each{ |r| 659 788 nsp = decideDomainNameProc.call( r ) 660 f.print( "PLUGIN#{nsp}_SRCS = \\\n" ) 661 gen_celltype_names_domain( f, " $(GEN_DIR)/", "_tecsgen.#{$c_suffix} \\\n", domain_type, r, true ) 662 gen_celltype_names_domain2( f, " $(GEN_DIR)/", ".#{$c_suffix} \\\n", domain_type, r, true, false ) 663 f.print( "# PLUGIN#{nsp}_SRCS terminator\n\n" ) 664 } 665 789 f.print( " $(PLUGIN#{nsp}_CELLTYPE_SRCS)\\\n" ) 790 } 791 f.print( "# PLUGIN_CELLTYPE_SRCS terminator\n\n" ) 792 f.print( "PLUGIN_TECSGEN_SRCS = \\\n" ) 793 domain_regions.each{ |r| 794 nsp = decideDomainNameProc.call( r ) 795 f.print( " $(PLUGIN#{nsp}_TECSGEN_SRCS)\\\n" ) 796 } 797 f.print( "# PLUGIN_TECSGEN_SRCS terminator\n\n" ) 798 domain_regions.each{ |r| 799 nsp = decideDomainNameProc.call( r ) 800 f.print( "PLUGIN#{nsp}_SRCS = $(PLUGIN#{nsp}_CELLTYPE_SRCS) $(PLUGIN#{nsp}_TECSGEN_SRCS)\n\n" ) 801 f.print( "PLUGIN#{nsp}_CELLTYPE_SRCS = \\\n" ) 802 gen_celltype_names_domain2( f, "", ".#{$c_suffix} \\\n", domain_type, r, true, false ) 803 f.print( "# PLUGIN#{nsp}_CELLTYPE_SRCS terminator\n\n" ) 804 nsp = decideDomainNameProc.call( r ) 805 f.print( "PLUGIN#{nsp}_TECSGEN_SRCS = \\\n" ) 806 gen_celltype_names_domain( f, "", "_tecsgen.#{$c_suffix} \\\n", domain_type, r, true ) 807 f.print( "# PLUGIN#{nsp}_TECSGEN_SRCS terminator\n\n" ) 808 } 809 810 f.print( "# CELLTYPE_SRCS: sources of celltype code written by user\n" ) 811 f.print( "CELLTYPE_SRCS = \\\n" ) 812 gen_celltype_names( f, " ", ".#{$c_suffix} \\\n", false, false ) 813 f.print( "# CELLTYPE_SRCS terminator\n\n" ) 666 814 f.close 667 815 … … 779 927 @namespace_list.each{ |ns| 780 928 ns.travers_all_signature_proc proc 929 } 930 end 931 932 #=== Namespace#すべてのセルタイプをたどる 933 def travers_all_celltype # ブロック引数 { |celltype| } 934 proc = Proc.new # このメソッドのブロック引数 935 @celltype_list.each{ |ct| 936 proc.call ct 937 } 938 @namespace_list.each{ |ns| 939 ns.travers_all_celltype_proc proc 940 } 941 end 942 def travers_all_celltype_proc proc 943 @celltype_list.each{ |ct| 944 proc.call ct 945 } 946 @namespace_list.each{ |ns| 947 ns.travers_all_celltype_proc proc 781 948 } 782 949 end … … 1023 1190 gen_ph_get_cellcb f 1024 1191 gen_ph_attr_access f if @n_attribute_rw > 0 || @n_attribute_ro > 0 || @n_var > 0 1025 gen_ph_cp_fun_macro f if @n_call_port > 0 1192 f.print "#ifndef TECSFLOW\n" 1193 gen_ph_cp_fun_macro f, false if @n_call_port > 0 1194 f.print "#else /* TECSFLOW */\n" 1195 gen_ph_cp_fun_macro f, true if @n_call_port > 0 1196 f.print "#endif /* TECSFLOW */\n" 1026 1197 # gen_ph_abstract_ep_des_type f 1027 1198 … … 1247 1418 def gen_ph_info f 1248 1419 1420 yn_multi_domain = "no" 1421 yn_multi_domain = "yes" if multi_domain? 1249 1422 yn_idx_is_id = "no" 1250 1423 yn_idx_is_id = "yes" if @idx_is_id … … 1255 1428 yn_rom = "no" 1256 1429 yn_rom = "yes" if $rom 1430 yn_has_CB = "no" 1431 yn_has_CB = "yes" if has_CB? 1432 yn_has_INIB = "no" 1433 yn_has_INIB = "yes" if has_INIB? 1257 1434 yn_cb_init = "no" 1258 1435 yn_cb_init = "yes" if need_CB_initializer? … … 1263 1440 * celltype : #{@name} 1264 1441 * global name : #{@global_name} 1442 * multi-domain : #{yn_multi_domain} 1265 1443 * idx_is_id(actual) : #{yn_idx_is_id}(#{yn_idx_is_id_act}) 1266 1444 * singleton : #{yn_singleton} 1267 * has_CB : #{ has_CB?}1268 * has_INIB : #{ has_INIB?}1445 * has_CB : #{yn_has_CB} 1446 * has_INIB : #{yn_has_INIB} 1269 1447 * rom : #{yn_rom} 1270 1448 * CB initializer : #{yn_cb_init} … … 1595 1773 f.print( "#define #{@global_name}_GET_CELLCB(idx) ((void *)0)\n" ) 1596 1774 elsif @idx_is_id_act then # mikan 単一のセルの場合の最適化, idx_is_id でない場合 1597 f.print( "#define #{@global_name}_GET_CELLCB(idx) (#{@global_name}_CB_ tab[(idx) - #{@global_name}_ID_BASE])\n" )1775 f.print( "#define #{@global_name}_GET_CELLCB(idx) (#{@global_name}_CB_ptab[(idx) - #{@global_name}_ID_BASE])\n" ) 1598 1776 else 1599 1777 f.print( "#define #{@global_name}_GET_CELLCB(idx) (idx)\n" ) … … 1799 1977 end 1800 1978 1801 def gen_ph_cp_fun_macro f 1802 if @n_call_port >0 then1979 def gen_ph_cp_fun_macro f, b_flow 1980 if @n_call_port >0 && b_flow == false then 1803 1981 f.printf( TECSMsg.get( :CPM_comment ) , "#_CPM_#" ) 1804 1982 end … … 1856 2034 1857 2035 # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ) 1858 if ! p.is_VMT_useless? then 2036 if b_flow then 2037 f.print( "\t (p_that)->#{p.get_name}#{subsc}.#{fun.get_name}__T( \\\n" ) 2038 elsif ! p.is_VMT_useless? then 1859 2039 # 標準コード 1860 2040 if @singleton then … … 1891 2071 1892 2072 # 受け口情報の出力(標準:受け口ディスクリプタ、最適化:IDX など) 1893 if ! p.is_skelton_useless? && ! p.is_cell_unique? then 2073 if b_flow then 2074 elsif ! p.is_skelton_useless? && ! p.is_cell_unique? then 1894 2075 # 標準コード 1895 2076 if @singleton then … … 1969 2150 p_cellcb = " #{@global_name}_CB *p_cellcb = p_that;\n" 1970 2151 delim = ", " 1971 cb = "p_ that#{inib}->"2152 cb = "p_cellcb#{inib}->" 1972 2153 end 1973 2154 … … 2616 2797 f.print "extern #{@global_name}_INIB #{@global_name}_SINGLE_CELL_INIB;\n" 2617 2798 end 2618 2619 # @ordered_cell_list.each{ |c|2620 # f.print "extern #{@global_name}_CB #{@global_name}_#{c.get_name}_CB;\n"2621 # }2622 2623 2799 f.print "\n" 2624 elsif @idx_is_id_act then 2625 f.print "extern #{@global_name}_CB *#{@global_name}_CB_tab[];\n" 2800 elsif @b_need_ptab then 2801 f.printf( TECSMsg.get( :SCP_comment ), "#_MCPP_#" ) 2802 if has_CB? then 2803 f.print "extern #{@global_name}_CB *const #{@global_name}_CB_ptab[];\n" 2804 @ordered_cell_list.each{ |c| 2805 if c.is_generate? then # 生成対象か? 2806 name_array = get_name_array c 2807 f.print "extern #{@global_name}_CB #{name_array[4]};\n" 2808 end 2809 } 2810 elsif has_INIB? 2811 f.print "extern #{@global_name}_INIB *const #{@global_name}_INIB_ptab[];\n" 2812 @ordered_cell_list.each{ |c| 2813 if c.is_generate? then # 生成対象か? 2814 name_array = get_name_array c 2815 f.print "extern #{@global_name}_INIB #{name_array[11]};\n" 2816 end 2817 } 2818 end 2626 2819 else 2627 f.print "extern #{@global_name}_CB #{@global_name}_CB_tab[];\n" 2820 f.printf( TECSMsg.get( :SCP_comment ), "#_MCPB_#" ) 2821 if has_CB? then 2822 f.print "extern #{@global_name}_CB #{@global_name}_CB_tab[];\n" 2823 elsif has_INIB? 2824 f.print "extern #{@global_name}_INIB #{@global_name}_INIB_tab[];\n" 2825 end 2628 2826 end 2629 2827 end 2630 2828 2631 2829 def gen_ph_INIB_as_CB f 2632 2830 # ここは、手抜きである。本来なら INIB を出力すべき 2633 2831 if ! has_CB? && has_INIB? then 2634 2832 f.printf( TECSMsg.get( :DCI_comment ), "#_DCI_#" ) 2635 f.print "#define #{@global_name}_CB_tab #{@global_name}_INIB_tab\n" 2636 f.print "#define #{@global_name}_SINGLE_CELL_CB #{@global_name}_SINGLE_CELL_INIB\n" 2833 if @singleton then 2834 f.print "#define #{@global_name}_SINGLE_CELL_CB #{@global_name}_SINGLE_CELL_INIB\n" 2835 elsif @b_need_ptab then 2836 f.print "#define #{@global_name}_CB_ptab #{@global_name}_INIB_ptab\n" 2837 else 2838 f.print "#define #{@global_name}_CB_tab #{@global_name}_INIB_tab\n" 2839 end 2637 2840 f.print "#define #{@global_name}_CB #{@global_name}_INIB\n" 2638 2841 f.print "#define tag_#{@global_name}_CB tag_#{@global_name}_INIB\n" … … 2658 2861 f.printf( TECSMsg.get( :FEC_comment ), "#_FEC_#" ) 2659 2862 2660 if @ idx_is_id_actthen2863 if @b_need_ptab then 2661 2864 amp = '' 2865 tab = 'ptab' 2662 2866 else 2663 2867 amp = '&' 2868 tab = 'tab' 2664 2869 end 2665 2870 f.print <<EOT 2666 2871 #define FOREACH_CELL(i,p_cb) \\ 2667 2872 for( (i) = 0; (i) < #{@global_name}_N_CELL; (i)++ ){ \\ 2668 #{necessity}(p_cb) = #{amp}#{@global_name}_CB_ tab[i];2873 #{necessity}(p_cb) = #{amp}#{@global_name}_CB_#{tab}[i]; 2669 2874 2670 2875 #define END_FOREACH_CELL } … … 2799 3004 if @singleton then 2800 3005 f.print "\t#{that}_inib = &#{@global_name}_SINGLE_CELL_INIB;\n\n" 2801 elsif @ idx_is_id_act2802 f.print "\t#{that}_inib = #{@global_name}_INIB_ tab[(i)];\n\n"3006 elsif @b_need_ptab then 3007 f.print "\t#{that}_inib = #{@global_name}_INIB_ptab[(i)];\n\n" 2803 3008 else 2804 3009 f.print "\t#{that}_inib = &#{@global_name}_INIB_tab[(i)];\n\n" … … 3397 3602 fs.each{ |r, f| f.print "#{@global_name}_INIB #{@global_name}_SINGLE_CELL_INIB = \n" } 3398 3603 indent = 0 3399 elsif ! @ idx_is_id_actthen3604 elsif ! @b_need_ptab then 3400 3605 fs.each{ |r, f| f.print "#{@global_name}_INIB #{@global_name}_INIB_tab[] = {\n" } 3401 3606 indent = 1 … … 3418 3623 3419 3624 print_indent( f, indent ) 3420 if @ idx_is_id_actthen3625 if @b_need_ptab then 3421 3626 f.print "const #{@global_name}_INIB #{name_array[5]} = " 3422 3627 end … … 3428 3633 unless @singleton then 3429 3634 # 1 つの cell INIB の終わり 3430 if @ idx_is_id_actthen3635 if @b_need_ptab then 3431 3636 f.print( "};\n\n" ) 3432 3637 else … … 3435 3640 end 3436 3641 } 3437 if ! @ idx_is_id_actthen3642 if ! @b_need_ptab then 3438 3643 fs.each{ |r, f| f.print( "};\n\n" ) } 3439 3644 end … … 3450 3655 fs.each{ |r, f| f.print "struct tag_#{@global_name}_CB #{@global_name}_SINGLE_CELL_CB = \n" } 3451 3656 indent = 0 3452 elsif ! @ idx_is_id_actthen3657 elsif ! @b_need_ptab then 3453 3658 fs.each{ |r, f| f.print "struct tag_#{@global_name}_CB #{@global_name}_CB_tab[] = {\n" } 3454 3659 indent = 1 … … 3471 3676 3472 3677 print_indent( f, indent ) 3473 if @ idx_is_id_actthen3678 if @b_need_ptab then 3474 3679 f.print "#{@global_name}_CB #{name_array[2]} = " 3475 3680 end … … 3493 3698 unless @singleton then 3494 3699 # 1 つの cell CB の終わり 3495 if @ idx_is_id_actthen3700 if @b_need_ptab then 3496 3701 f.print( "};\n\n" ) 3497 3702 else … … 3500 3705 end 3501 3706 } 3502 if ! @ idx_is_id_actthen3707 if ! @b_need_ptab then 3503 3708 fs.each{ |r, f| f.print( "};\n\n" ) } 3504 3709 end … … 3507 3712 fs.each{ |r, f| f.print "struct tag_#{@global_name}_CB #{@global_name}_SINGLE_CELL_CB;\n" } 3508 3713 indent = 0 3509 elsif @ idx_is_id_actthen3714 elsif @b_need_ptab then 3510 3715 @ordered_cell_list.each{ |c| 3511 3716 next if ! c.is_generate? … … 3526 3731 def gen_cell_cb_tab f 3527 3732 indent = 0 3528 if @ idx_is_id_actthen3733 if @b_need_ptab then 3529 3734 if has_INIB? && ( $ram_initializer || ! has_CB? ) then 3530 3735 f.print "/* ID to INIB table #_INTAB_# */\n" … … 3537 3742 } 3538 3743 3539 f.print "#{@global_name}_INIB * #{@global_name}_INIB_tab[] ={\n"3744 f.print "#{@global_name}_INIB *const #{@global_name}_INIB_ptab[] ={\n" 3540 3745 @ordered_cell_list.each{ |c| 3541 3746 if c.is_generate? then # 生成対象か? … … 3557 3762 } 3558 3763 3559 f.print "#{@global_name}_CB * #{@global_name}_CB_tab[] ={\n"3764 f.print "#{@global_name}_CB *const #{@global_name}_CB_ptab[] ={\n" 3560 3765 @ordered_cell_list.each{ |c| 3561 3766 if c.is_generate? then # 生成対象か? … … 3586 3791 # name_array[9] = @global_name # celltype global name 3587 3792 # name_array[10] = cell.get_global_name # cell global name 3793 # name_array[11] = cell_INIB_proto #INIB name for proto type 3588 3794 3589 3795 def get_name_array( cell ) … … 3594 3800 cell_CB_proto = "#{@global_name}_SINGLE_CELL_CB" 3595 3801 cell_INIB_name = "#{@global_name}_SINGLE_CELL_INIB" 3802 cell_INIB_proto = cell_INIB_name 3596 3803 cell_ID = 0 3597 3804 else 3598 if ! @ idx_is_id_actthen3805 if ! @b_need_ptab then 3599 3806 index = cell.get_id - cell.get_celltype.get_id_base 3600 3807 cell_CB_name = "#{@global_name}_CB_tab[#{index}]" … … 3602 3809 cell_CB_proto = "#{@global_name}_CB_tab[]" 3603 3810 cell_INIB_name = "#{@global_name}_INIB_tab[#{index}]" 3811 cell_INIB_proto = "#{@global_name}_INIB_tab[]" 3604 3812 else 3605 3813 cell_CB_name = "#{cell.get_global_name}_CB" … … 3607 3815 cell_CB_proto = cell_CB_name 3608 3816 cell_INIB_name = "#{cell.get_global_name}_INIB" 3817 cell_INIB_proto = cell_INIB_name 3609 3818 end 3610 3819 cell_ID = cell.get_id 3611 end3612 if @idx_is_id_act then3613 cell_IDX = cell_ID3614 else3615 cell_IDX = "&#{cell_CB_name}"3616 3820 end 3617 3821 … … 3622 3826 else 3623 3827 cell_CBP = "NULL" # CB も INIB もなければ NULL に置換 3828 end 3829 3830 if @idx_is_id_act then 3831 cell_IDX = cell_ID 3832 else 3833 cell_IDX = cell_CBP 3624 3834 end 3625 3835 … … 3636 3846 name_array[9] = @global_name # celltype global name 3637 3847 name_array[10] = cell.get_global_name # cell global name 3848 name_array[11] = cell_INIB_proto # INIB name for prototype 3638 3849 3639 3850 return name_array … … 3820 4031 c = j.get_rhs_cell # 呼び先セル 3821 4032 ct = c.get_celltype # 呼び先セルタイプ 4033 name_array = ct.get_name_array( c ) # 呼び先セルタイプで name_array を得る 3822 4034 if ct.has_INIB? || ct.has_CB? then 3823 name_array = ct.get_name_array( c ) # 呼び先セルタイプで name_array を得る3824 4035 f.printf( "%-40s /* %s #_CCP2_# */\n", "#{name_array[7]},", p.get_name ) 3825 4036 else … … 4107 4318 f = fs[ c.get_region.get_domain_root ] 4108 4319 4109 ct = c.get_celltype 4320 ct = c.get_celltype # ct = self でも同じ 4110 4321 jl = c.get_join_list 4322 name_array = get_name_array( c ) 4111 4323 4112 4324 port = ct.get_port_list … … 4143 4355 else 4144 4356 if has_CB? then 4145 if @singleton then 4146 f.print " &#{@global_name}_SINGLE_CELL_CB, /* CB */\n" 4147 else 4148 # f.print " &#{@global_name}_#{c.get_name}_CB,\n" 4149 f.print " &#{@global_name}_CB_tab[#{index}], /* CB */\n" 4150 end 4357 # if @singleton then 4358 # f.print " &#{@global_name}_SINGLE_CELL_CB, /* CB 1 */\n" 4359 # else 4360 # # f.print " &#{@global_name}_#{c.get_name}_CB,\n" 4361 # f.print " &#{@global_name}_CB_tab[#{index}], /* CB 2 */\n" 4362 # end 4363 f.print " #{name_array[8]}, /* CB 1 */\n" 4151 4364 elsif has_INIB? then 4152 if @singleton then 4153 f.print " &#{@global_name}_SINGLE_CELL_INIB, /* INIB */\n" 4154 else 4155 f.print " &#{@global_name}_INIB_tab[#{index}], /* INIB */\n" 4156 end 4365 # if @singleton then 4366 # f.print " &#{@global_name}_SINGLE_CELL_INIB, /* INIB 1 */\n" 4367 # else 4368 # f.print " &#{@global_name}_INIB_tab[#{index}], /* INIB 2 */\n" 4369 # end 4370 f.print " &#{name_array[5]}, /* INIB 1 */\n" 4157 4371 else 4158 4372 f.print " 0,\n" … … 4178 4392 else 4179 4393 if has_CB? then 4180 if @singleton then 4181 f.print " &#{@global_name}_SINGLE_CELL_CB, /* CB */\n" 4182 else 4183 f.print " &#{@global_name}_CB_tab[#{index}], /* CB */\n" 4184 # f.print " &#{@global_name}_#{c.get_name}_CB,\n" 4185 end 4394 # if @singleton then 4395 # f.print " &#{@global_name}_SINGLE_CELL_CB, /* CB 3 */\n" 4396 # else 4397 # f.print " &#{@global_name}_CB_tab[#{index}], /* CB 4 */\n" 4398 # # f.print " &#{@global_name}_#{c.get_name}_CB,\n" 4399 # end 4400 f.print " #{name_array[8]}, /* CB 3 */\n" 4186 4401 elsif has_INIB? then 4187 if @singleton then 4188 f.print " &#{@global_name}_SINGLE_CELL_INIB, /* INIB */\n" 4189 else 4190 f.print " &#{@global_name}_INIB_tab[#{index}], /* INIB */\n" 4191 end 4402 # if @singleton then 4403 # f.print " &#{@global_name}_SINGLE_CELL_INIB, /* INIB 3 */\n" 4404 # else 4405 # # f.print " &#{@global_name}_INIB_tab[#{index}], /* INIB 4 */\n" 4406 # end 4407 f.print " &#{name_array[5]}, /* INIB 3 */\n" 4192 4408 else 4193 4409 f.print " 0,\n" … … 4550 4766 def generate_inline_template_code 4551 4767 return if @n_entry_port_inline == 0 4768 return if @b_reuse && ! $generate_all_template 4552 4769 if ! ( @plugin && @plugin.gen_ep_func? ) then 4553 4770 return if @b_reuse && ! $generate_all_template … … 4927 5144 # str に以下の置換を行う 4928 5145 #- $ct$ ⇒ セルタイプ名(ct) 4929 #- $cell$ ⇒ セル名(cell) cell が nil ならば 3つの置換は行われない5146 #- $cell$ ⇒ セル名(cell) cell が nil ならば以下の置換は行われない 4930 5147 #- $cb$ ⇒ CB の C 言語名(cb) 4931 5148 #- $cbp$ ⇒ CB へのポインタ(cbp) 4932 5149 #- $cb_proto$ ⇒ CB の C 言語名プロトタイプ宣言用(cb_proto) 4933 #- $id$ ⇒ ct_cell5150 #- $id$ ⇒ $ct$_$cell_global$ # ct_cell before or same V1.5.2 4934 5151 #- $idx$ ⇒ idx 4935 5152 #- $ID$ ⇒ id (整数の番号) 4936 5153 #- $ct_global$ ⇒ セルタイプ名(ct) 4937 #- $cell_global$ ⇒ セル名(cell) cell が nil ならば3つの置換は行われない5154 #- $cell_global$ ⇒ セル名(cell) 4938 5155 #- $$ ⇒ $ 4939 5156 def subst_name( str, name_array ) … … 4950 5167 4951 5168 str = str.gsub( /(^|[^\$])\$ct\$/, "\\1#{ct}" ) 5169 str = str.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{ct_global}" ) 4952 5170 if cell then 4953 5171 str = str.gsub( /(^|[^\$])\$cell\$/, "\\1#{cell}" ) 4954 5172 str = str.gsub( /(^|[^\$])\$cb\$/, "\\1#{cb}" ) 4955 str = str.gsub( /(^|[^\$])\$id\$/, "\\1#{ct}_#{cell}" ) 5173 # str = str.gsub( /(^|[^\$])\$id\$/, "\\1#{ct}_#{cell}" ) 5174 str = str.gsub( /(^|[^\$])\$id\$/, "\\1#{ct}_#{cell_global}" ) 4956 5175 str = str.gsub( /(^|[^\$])\$cb_proto\$/, "\\1#{cb_proto}" ) 4957 5176 str = str.gsub( /(^|[^\$])\$ID\$/, "\\1#{id}" ) 4958 5177 str = str.gsub( /(^|[^\$])\$idx\$/, "\\1#{idx}" ) 4959 5178 str = str.gsub( /(^|[^\$])\$cbp\$/, "\\1#{cbp}" ) 4960 str = str.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{ct_global}" )4961 5179 str = str.gsub( /(^|[^\$])\$cell_global\$/, "\\1#{cell_global}" ) 4962 5180 end … … 5078 5296 end 5079 5297 end 5298 5299 class DomainType < Node 5300 def gen_factory 5301 # p "DomainType: gen_factory" 5302 @plugin.gen_factory 5303 end 5304 end
Note:
See TracChangeset
for help on using the changeset viewer.