source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/plugin/RepeatJoinPlugin.rb@ 374

Last change on this file since 374 was 374, checked in by coas-nagasima, 5 years ago

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

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 4.9 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2015-2018 by TOPPERS Project
7#
8#--
9# 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14# スコード中に含まれていること.
15# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18# の無保証規定を掲載すること.
19# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21# と.
22# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23# 作権表示,この利用条件および下記の無保証規定を掲載すること.
24# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25# 報告すること.
26# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30# 免責すること.
31#
32# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36# の責任を負わない.
37#
38# $Id$
39#++
40
41class RepeatJoinPlugin < CellPlugin
42
43 RepeatJoinPluginArgProc = {
44 "count" => Proc.new { |obj,rhs| obj.set_count rhs }
45 }
46
47 def initialize( cell, option )
48 super
49 print "RepeatJoinPlugin: #{@cell.get_name}\n"
50 # cell.show_tree 0
51 @plugin_arg_check_proc_tab = RepeatJoinPluginArgProc
52 parse_plugin_arg
53
54 @cell.get_join_list.get_items.each{ |j|
55 # print "Join: #{j.get_name} = #{j.get_rhs.to_s}\n"
56
57 # Join の右辺を解析
58 ret = j.get_rhs.analyze_cell_join_expression
59 if ret == nil then
60 next
61 end
62 rhs_nsp = ret[0]; rhs_subscript = ret[1]; rhs_port_name = ret[2]
63
64 # 呼び口配列で、添数が 0 の場合にのみカウントアップさせる
65 if j.get_subscript == 0 then
66 rhs_name = rhs_nsp.get_name.to_s
67 if rhs_name =~ /(.*[^0-9])([0-9]+)\z/ then
68 b_rhs_name_count = true
69 rhs_name = $1
70 n_digits = $2.length
71 rhs_count_base = $2.to_i
72 else
73 b_rhs_name_count = false
74 rhs_count_base = 0
75 end
76
77 if rhs_subscript && rhs_subscript == 0 then
78 b_rhs_subscript_count = true
79 else
80 b_rhs_subscript_count = false
81 end
82
83 count = 1
84 while count < @count
85 count_str = (count+rhs_count_base).to_s
86
87 if b_rhs_subscript_count then
88 rhs_subscript = count
89 end
90
91 if b_rhs_name_count then
92 if n_digits - count_str.length > 0 then
93 leading_zero = "0" * ( n_digits - count_str.length )
94 else
95 leading_zero = ""
96 end
97
98 rhs_name_real = rhs_name + leading_zero + count_str
99 else
100 rhs_name_real = rhs_name
101 end
102 rhs_nsp2 = rhs_nsp.change_name_clone rhs_name_real.to_sym
103
104 rhs = Expression.create_cell_join_expression( rhs_nsp2, rhs_subscript, rhs_port_name )
105 j2 = Join.new( j.get_name, count, rhs )
106 cell.new_join j2
107
108 count += 1
109 end
110 end
111 }
112 end
113
114 #=== count オプションの解析
115 def set_count rhs
116 if rhs =~ /\A\d+\z/
117 @count = rhs.to_i
118 else
119 nsp = NamespacePath.new( rhs.to_sym, true )
120 expr = Expression.create_single_identifier( nsp, nil )
121 res = expr.eval_const( nil )
122 if res == nil then
123 cdl_error( "count value ($1): not single identifier or integer number", rhs.to_s )
124 @count = 0
125 else
126 @count = res
127 end
128 end
129 end
130
131end
Note: See TracBrowser for help on using the repository browser.