1 # Copyright (C) 2000 Red Hat
3 # This is a component that forwards almost all sid requests to another
4 # component. Further, it interjects proxy pin/bus objects between the
5 # outside world and the victim. All traffic may be traced.
8 set this [sid::component::this]
10 # A handle to my victim component
18 # map proxy-pin<->real-pin
19 global proxy2real_pin_map
20 global real2proxy_pin_map
22 proc real2proxy_pin {pin} {
23 global proxy2real_pin_map
24 global real2proxy_pin_map
25 if [info exists real2proxy_pin_map($pin)] then {
26 set pin $real2proxy_pin_map($pin)
28 set proxy [sid::pin::new]
29 set proxy2real_pin_map($proxy) $pin
30 set real2proxy_pin_map($pin) $proxy
36 proc proxy2real_pin {pin} {
37 global proxy2real_pin_map
38 if [info exists proxy2real_pin_map($pin)] then {
39 set pin $proxy2real_pin_map($pin)
41 error "Unknown proxy pin $pin"
46 # map proxy-bus<->real-bus
47 global proxy2real_bus_map
48 global real2proxy_bus_map
50 proc real2proxy_bus {bus} {
51 global proxy2real_bus_map
52 global real2proxy_bus_map
53 if [info exists real2proxy_bus_map($bus)] then {
54 set bus $real2proxy_bus_map($bus)
56 set proxy [sid::bus::new]
57 set proxy2real_bus_map($proxy) $bus
58 set real2proxy_bus_map($bus) $proxy
64 proc proxy2real_bus {bus} {
65 global proxy2real_bus_map
66 if [info exists proxy2real_bus_map($bus)] then {
67 set bus $proxy2real_bus_map($bus)
69 error "Unknown proxy bus $bus"
76 if {$victim_trace_p != "0"} then {
77 puts -nonewline "$cmd >"
79 set result [uplevel 1 $cmd]
80 if {$victim_trace_p != "0"} then {
86 proc attribute_names {} {
88 return [sidtrace [list sid::component::attribute_names $victim]]
91 proc attribute_names_in_category {cat} {
93 # special hack to prevent error message during component instantiation
94 if {$victim == ""} then { return [list] }
95 # don't add "victim-trace?" - that would make wrapper more translucent
96 return [sidtrace [list sid::component::attribute_names_in_category $victim $cat]]
99 proc attribute_value {attr} {
101 return [sidtrace [list sid::component::attribute_value $victim $attr]]
104 proc set_attribute_value {attr value} {
106 if {$attr == "victim-trace?"} then {
107 global victim_trace_p
108 set victim_trace_p $value
111 return [sidtrace [list sid::component::set_attribute_value $victim $attr $value]]
117 return [sidtrace [list sid::component::pin_names $victim]]
120 proc find_pin {name} {
122 set pin [sidtrace [list sid::component::find_pin $victim $name]]
123 if {$pin == ""} then { return "" } else { return [real2proxy_pin $pin] }
126 proc connect_pin {name pin} {
128 set proxy [real2proxy_pin $pin]
129 return [sidtrace [list sid::component::connect_pin $victim $name $proxy]]
132 proc disconnect_pin {name pin} {
134 set proxy [real2proxy_pin $pin]
135 return [sidtrace [list sid::component::disconnect_pin $victim $name $proxy]]
138 proc connected_pins {name} {
140 set victimpins [sidtrace [list sid::component::connected_pins $victim $name]]
142 foreach pin $victimpins {
143 lappend realpins [proxy2real_pin $pin]
150 return [sidtrace [list sid::component::bus_names $victim]]
153 proc find_bus {name} {
155 set bus [sidtrace [list sid::component::find_bus $victim $name]]
156 if {$bus == ""} then { return "" } else { return [real2proxy_bus $bus] }
159 proc accessor_names {} {
161 return [sidtrace [list sid::component::accessor_names $victim]]
164 proc connect_accessor {name bus} {
166 set proxy [real2proxy_bus $bus]
167 return [sidtrace [list sid::component::connect_accessor $victim $name $proxy]]
170 proc disconnect_accessor {name bus} {
172 set proxy [real2proxy_bus $bus]
173 return [sidtrace [list sid::component::disconnect_accessor $victim $name $proxy]]
176 proc connected_bus {name} {
178 set bus [sidtrace [list sid::component::connected_bus $victim $name]]
179 if {$bus == ""} then { return "" } else { return [real2proxy_bus $bus] }
182 proc relationship_names {} {
184 # don't add "victim" - that would make wrapper more translucent
185 return [sidtrace [list sid::component::relationship_names $victim]]
188 proc relate {rel comp} {
190 if {$rel == "victim"} then {
194 return [sidtrace [list sid::component::relate $victim $rel $comp]]
198 proc unrelate {rel comp} {
200 if {$rel == "victim"} then {
204 return [sidtrace [list sid::component::unrelate $victim $rel $comp]]
209 proc related_components {rel} {
211 if {$rel == "victim"} then {
214 return [sidtrace [list sid::component::related_components $victim $rel]]
219 # proxy pin functions
220 proc driven_h4 {proxy value} {
221 set pin [proxy2real_pin $proxy]
222 return [sidtrace [list sid::pin::driven_h4 $pin $value]]
226 # proxy bus functions
228 proc write_h4_l1 {proxy addr data} {
229 set bus [proxy2real_bus $proxy]
230 return [sidtrace [list sid::bus::write_h4_l1 $bus $addr $data]]
232 proc write_h4_l2 {proxy addr data} {
233 set bus [proxy2real_bus $proxy]
234 return [sidtrace [list sid::bus::write_h4_l2 $bus $addr $data]]
236 proc write_h4_l4 {proxy addr data} {
237 set bus [proxy2real_bus $proxy]
238 return [sidtrace [list sid::bus::write_h4_l4 $bus $addr $data]]
240 proc write_h4_l8 {proxy addr data} {
241 set bus [proxy2real_bus $proxy]
242 return [sidtrace [list sid::bus::write_h4_l8 $bus $addr $data]]
244 proc read_h4_l1 {proxy addr} {
245 set bus [proxy2real_bus $proxy]
246 return [sidtrace [list sid::bus::read_h4_l1 $bus $addr]]
248 proc read_h4_l2 {proxy addr} {
249 set bus [proxy2real_bus $proxy]
250 return [sidtrace [list sid::bus::read_h4_l2 $bus $addr]]
252 proc read_h4_l4 {proxy addr} {
253 set bus [proxy2real_bus $proxy]
254 return [sidtrace [list sid::bus::read_h4_l4 $bus $addr]]
256 proc read_h4_l8 {proxy addr} {
257 set bus [proxy2real_bus $proxy]
258 return [sidtrace [list sid::bus::read_h4_l8 $bus $addr]]
262 proc write_h4_b1 {proxy addr data} {
263 set bus [proxy2real_bus $proxy]
264 return [sidtrace [list sid::bus::write_h4_b1 $bus $addr $data]]
266 proc write_h4_b2 {proxy addr data} {
267 set bus [proxy2real_bus $proxy]
268 return [sidtrace [list sid::bus::write_h4_b2 $bus $addr $data]]
270 proc write_h4_b4 {proxy addr data} {
271 set bus [proxy2real_bus $proxy]
272 return [sidtrace [list sid::bus::write_h4_b4 $bus $addr $data]]
274 proc write_h4_b8 {proxy addr data} {
275 set bus [proxy2real_bus $proxy]
276 return [sidtrace [list sid::bus::write_h4_b8 $bus $addr $data]]
278 proc read_h4_b1 {proxy addr} {
279 set bus [proxy2real_bus $proxy]
280 return [sidtrace [list sid::bus::read_h4_b1 $bus $addr]]
282 proc read_h4_b2 {proxy addr} {
283 set bus [proxy2real_bus $proxy]
284 return [sidtrace [list sid::bus::read_h4_b2 $bus $addr]]
286 proc read_h4_b4 {proxy addr} {
287 set bus [proxy2real_bus $proxy]
288 return [sidtrace [list sid::bus::read_h4_b4 $bus $addr]]
290 proc read_h4_b8 {proxy addr} {
291 set bus [proxy2real_bus $proxy]
292 return [sidtrace [list sid::bus::read_h4_b8 $bus $addr]]