Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 562 lines (484 sloc) 13.561 kb
30e8289 Simulate named event trigger and waits.
steve authored
1 /*
2 * Copyright (c) 2000 Stephen Williams (steve@icarus.com)
3 *
4 * This source code is free software; you can redistribute it
5 * and/or modify it in source code form under the terms of the GNU
6 * General Public License as published by the Free Software
7 * Foundation; either version 2 of the License, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
18 */
52bf4e6 conditional ident string using autoconfig.
steve authored
19 #ifdef HAVE_CVS_IDENT
c7d97f4 Properly evaluate scope path expressions.
steve authored
20 #ident "$Id: net_event.cc,v 1.27 2007/06/02 03:42:13 steve Exp $"
30e8289 Simulate named event trigger and waits.
steve authored
21 #endif
22
badad63 All NetObj objects have lex_string base names.
steve authored
23 # include "config.h"
24 # include "compiler.h"
30e8289 Simulate named event trigger and waits.
steve authored
25 # include "netlist.h"
26
4c67de5 Add the lex_strings string handler, and put
steve authored
27 /*
28 * NOTE: The name_ is perm-allocated by the caller.
29 */
536068b Memory and Event names use perm_string.
steve authored
30 NetEvent::NetEvent(perm_string n)
4c67de5 Add the lex_strings string handler, and put
steve authored
31 : name_(n)
30e8289 Simulate named event trigger and waits.
steve authored
32 {
33 scope_ = 0;
34 snext_ = 0;
4493e96 Finally remove the NetNEvent and NetPEvent classes,
steve authored
35 probes_ = 0;
726f7b8 Synthesis of comparator in expressions.
steve authored
36 trig_ = 0;
37 waitref_ = 0;
f1cc9d8 Support event names as expressions elements.
steve authored
38 exprref_ = 0;
c1c0168 Globally merge redundant event objects.
steve authored
39 wlist_ = 0;
30e8289 Simulate named event trigger and waits.
steve authored
40 }
41
42 NetEvent::~NetEvent()
43 {
726f7b8 Synthesis of comparator in expressions.
steve authored
44 assert(waitref_ == 0);
74c4303 Clean up unneeded NetEvent objects.
steve authored
45 if (scope_) scope_->rem_event(this);
46 while (probes_) {
47 NetEvProbe*tmp = probes_->enext_;
48 delete probes_;
ea53f2b Typo stepping ot next probe in delete.
steve authored
49 probes_ = tmp;
74c4303 Clean up unneeded NetEvent objects.
steve authored
50 }
4c67de5 Add the lex_strings string handler, and put
steve authored
51 /* name_ is lex_strings. */
30e8289 Simulate named event trigger and waits.
steve authored
52 }
53
536068b Memory and Event names use perm_string.
steve authored
54 perm_string NetEvent::name() const
30e8289 Simulate named event trigger and waits.
steve authored
55 {
56 return name_;
57 }
58
c7d97f4 Properly evaluate scope path expressions.
steve authored
59 NetScope* NetEvent::scope()
30e8289 Simulate named event trigger and waits.
steve authored
60 {
61 assert(scope_);
c7d97f4 Properly evaluate scope path expressions.
steve authored
62 return scope_;
30e8289 Simulate named event trigger and waits.
steve authored
63 }
64
a4e528f Add the ivl_event_t to ivl_target, and use that to generate
steve authored
65 const NetScope* NetEvent::scope() const
66 {
67 assert(scope_);
68 return scope_;
69 }
70
4493e96 Finally remove the NetNEvent and NetPEvent classes,
steve authored
71 unsigned NetEvent::nprobe() const
72 {
73 unsigned cnt = 0;
74 NetEvProbe*cur = probes_;
75 while (cur) {
76 cnt += 1;
77 cur = cur->enext_;
78 }
79
80 return cnt;
81 }
82
83 NetEvProbe* NetEvent::probe(unsigned idx)
84 {
85 NetEvProbe*cur = probes_;
86 while (cur && idx) {
87 cur = cur->enext_;
88 idx -= 1;
89 }
90 return cur;
91 }
92
ad8565f Add const probe method to NetEvent.
steve authored
93 const NetEvProbe* NetEvent::probe(unsigned idx) const
94 {
95 NetEvProbe*cur = probes_;
96 while (cur && idx) {
97 cur = cur->enext_;
98 idx -= 1;
99 }
100 return cur;
101 }
102
74c4303 Clean up unneeded NetEvent objects.
steve authored
103 unsigned NetEvent::ntrig() const
104 {
105 unsigned cnt = 0;
106 NetEvTrig*cur = trig_;
107 while (cur) {
108 cnt += 1;
109 cur = cur->enext_;
110 }
111
112 return cnt;
113 }
114
726f7b8 Synthesis of comparator in expressions.
steve authored
115 unsigned NetEvent::nwait() const
116 {
117 return waitref_;
118 }
119
f1cc9d8 Support event names as expressions elements.
steve authored
120 unsigned NetEvent::nexpr() const
121 {
122 return exprref_;
123 }
124
bcbd5b2 Remove limits from the similar events search.
steve authored
125 /*
126 * A "similar" event is one that has an identical non-nil set of
127 * probes.
128 */
58ec62c Rewrite find_similar_event to support doing
steve authored
129 void NetEvent::find_similar_event(list<NetEvent*>&event_list)
fd09bc3 Merge similar probes within a module.
steve authored
130 {
131 if (probes_ == 0)
58ec62c Rewrite find_similar_event to support doing
steve authored
132 return;
bcbd5b2 Remove limits from the similar events search.
steve authored
133
58ec62c Rewrite find_similar_event to support doing
steve authored
134 map<NetEvent*,unsigned> event_matches;
fd09bc3 Merge similar probes within a module.
steve authored
135
58ec62c Rewrite find_similar_event to support doing
steve authored
136 /* First, get a list of all the NetEvProbes that are connected
137 to my first probe. Then use that to create a set of
138 candidate events. These candidate events are a superset of
139 the similar events, so I will be culling this list later. */
140 list<NetEvProbe*>first_probes;
141 probes_->find_similar_probes(first_probes);
bcbd5b2 Remove limits from the similar events search.
steve authored
142
58ec62c Rewrite find_similar_event to support doing
steve authored
143 for (list<NetEvProbe*>::iterator idx = first_probes.begin()
144 ; idx != first_probes.end() ; idx ++) {
145 event_matches[ (*idx)->event() ] = 1;
146 }
fd09bc3 Merge similar probes within a module.
steve authored
147
58ec62c Rewrite find_similar_event to support doing
steve authored
148 /* Now scan the remaining probes, in each case ticking the
149 candidate event. The events that really are similar to this
150 one will turn up in every probe list. */
151 unsigned probe_count = 1;
152 for (NetEvProbe*cur = probes_->enext_ ; cur ; cur = cur->enext_) {
153 list<NetEvProbe*>similar_probes;
154 cur->find_similar_probes(similar_probes);
155
156 for (list<NetEvProbe*>::iterator idx = similar_probes.begin()
157 ; idx != similar_probes.end() ; idx ++) {
158 event_matches[ (*idx)->event() ] += 1;
159 }
fd09bc3 Merge similar probes within a module.
steve authored
160
58ec62c Rewrite find_similar_event to support doing
steve authored
161 probe_count += 1;
fd09bc3 Merge similar probes within a module.
steve authored
162 }
163
58ec62c Rewrite find_similar_event to support doing
steve authored
164 /* Now scan the candidate events. Those events that are
165 connected to all my probes (match_count[x] == probe_count)
166 are possible. If those events have the same number of
167 events, then jackpot. */
168 for (map<NetEvent*,unsigned>::iterator idx = event_matches.begin()
169 ; idx != event_matches.end() ; idx ++) {
bcbd5b2 Remove limits from the similar events search.
steve authored
170
58ec62c Rewrite find_similar_event to support doing
steve authored
171 NetEvent*tmp = (*idx).first;
bcbd5b2 Remove limits from the similar events search.
steve authored
172
58ec62c Rewrite find_similar_event to support doing
steve authored
173 if (tmp == this)
bcbd5b2 Remove limits from the similar events search.
steve authored
174 continue;
175
18edf2f Rework of automatic task/function support.
Martin Whitaker authored
176 /* For automatic tasks, the VVP runtime holds state for events
177 in the automatically allocated context. This means we can't
178 merge similar events in different automatic tasks. */
179 if (scope()->is_auto() && (tmp->scope() != scope()))
180 continue;
181
58ec62c Rewrite find_similar_event to support doing
steve authored
182 if ((*idx).second != probe_count)
54dab22 event find_similar should not find self.
steve authored
183 continue;
184
58ec62c Rewrite find_similar_event to support doing
steve authored
185 unsigned tcnt = 0;
186 for (NetEvProbe*cur = tmp->probes_ ; cur ; cur = cur->enext_)
187 tcnt += 1;
bcbd5b2 Remove limits from the similar events search.
steve authored
188
58ec62c Rewrite find_similar_event to support doing
steve authored
189 if (tcnt == probe_count)
190 event_list .push_back(tmp);
fd09bc3 Merge similar probes within a module.
steve authored
191 }
192
193 }
194
58ec62c Rewrite find_similar_event to support doing
steve authored
195
c1c0168 Globally merge redundant event objects.
steve authored
196 void NetEvent::replace_event(NetEvent*that)
197 {
198 while (wlist_) {
199 wlist_->obj->replace_event(this, that);
200 }
201 }
202
9b6b081 Add structure for asynchronous logic synthesis.
steve authored
203 NexusSet* NetEvent::nex_async_()
204 {
205 /* If there are behavioral trigger statements attached to me,
206 then this is not an asynchronous event. */
207 if (trig_ != 0)
208 return 0;
209
e4ae832 Clean up spurious trailing white space.
steve authored
210
9b6b081 Add structure for asynchronous logic synthesis.
steve authored
211 NexusSet*tmp = new NexusSet;
212 for (NetEvProbe*cur = probes_ ; cur != 0 ; cur = cur->enext_) {
213 if (cur->edge() != NetEvProbe::ANYEDGE) {
214 delete tmp;
215 return 0;
216 }
217
218 for (unsigned idx = 0 ; idx < cur->pin_count() ; idx += 1)
219 tmp->add(cur->pin(idx).nexus());
220
221 }
222
223 return tmp;
224 }
225
30e8289 Simulate named event trigger and waits.
steve authored
226 NetEvTrig::NetEvTrig(NetEvent*ev)
227 : event_(ev)
228 {
726f7b8 Synthesis of comparator in expressions.
steve authored
229 enext_ = event_->trig_;
230 event_->trig_ = this;
30e8289 Simulate named event trigger and waits.
steve authored
231 }
232
233 NetEvTrig::~NetEvTrig()
234 {
726f7b8 Synthesis of comparator in expressions.
steve authored
235 if (event_->trig_ == this) {
236 event_->trig_ = enext_;
237
238 } else {
239 NetEvTrig*cur = event_->trig_;
240 while (cur->enext_ != this) {
241 assert(cur->enext_);
242 cur = cur->enext_;
243 }
244
245 cur->enext_ = this->enext_;
246 }
30e8289 Simulate named event trigger and waits.
steve authored
247 }
248
249 const NetEvent* NetEvTrig::event() const
250 {
251 return event_;
252 }
253
27af95d Use perm_strings for named langiage items.
steve authored
254 NetEvProbe::NetEvProbe(NetScope*s, perm_string n, NetEvent*tgt,
8dbd641 All events now use the NetEvent class.
steve authored
255 edge_t t, unsigned p)
27af95d Use perm_strings for named langiage items.
steve authored
256 : NetNode(s, n, p), event_(tgt), edge_(t)
8dbd641 All events now use the NetEvent class.
steve authored
257 {
258 for (unsigned idx = 0 ; idx < p ; idx += 1) {
259 pin(idx).set_dir(Link::INPUT);
260 }
4493e96 Finally remove the NetNEvent and NetPEvent classes,
steve authored
261
262 enext_ = event_->probes_;
263 event_->probes_ = this;
8dbd641 All events now use the NetEvent class.
steve authored
264 }
265
266 NetEvProbe::~NetEvProbe()
267 {
726f7b8 Synthesis of comparator in expressions.
steve authored
268 if (event_->probes_ == this) {
269 event_->probes_ = enext_;
270
271 } else {
272 NetEvProbe*cur = event_->probes_;
273 while (cur->enext_ != this) {
274 assert(cur->enext_);
275 cur = cur->enext_;
276 }
277
278 cur->enext_ = this->enext_;
279 }
8dbd641 All events now use the NetEvent class.
steve authored
280 }
281
282 NetEvProbe::edge_t NetEvProbe::edge() const
283 {
284 return edge_;
285 }
286
fd09bc3 Merge similar probes within a module.
steve authored
287 NetEvent* NetEvProbe::event()
288 {
289 return event_;
290 }
291
8dbd641 All events now use the NetEvent class.
steve authored
292 const NetEvent* NetEvProbe::event() const
293 {
294 return event_;
295 }
296
58ec62c Rewrite find_similar_event to support doing
steve authored
297 /*
298 * A similar NetEvProbe is one that is connected to all the same nexa
299 * that this probe is connected to, and also is the same edge
300 * type. Don't count myself as a similar probe.
301 */
302 void NetEvProbe::find_similar_probes(list<NetEvProbe*>&plist)
303 {
304 Nexus*nex = pin(0).nexus();
305
306 for (Link*lcur = nex->first_nlink(); lcur; lcur = lcur->next_nlink()) {
b292a5f @steveicarus Create a branch object to be the argument to the access function.
authored
307 NetPins*obj = lcur->get_obj();
58ec62c Rewrite find_similar_event to support doing
steve authored
308 if (obj->pin_count() != pin_count())
309 continue;
310
311 NetEvProbe*tmp = dynamic_cast<NetEvProbe*>(obj);
312 if (tmp == 0)
313 continue;
314
315 if (tmp == this)
316 continue;
317
318 if (edge() != tmp->edge())
319 continue;
320
321 bool ok_flag = true;
322 for (unsigned idx = 1 ; idx < pin_count() ; idx += 1)
323 if (pin(idx).nexus() != tmp->pin(idx).nexus()) {
324 ok_flag = false;
325 break;
326 }
327
328 if (ok_flag == true)
329 plist .push_back(tmp);
330 }
331 }
332
b1fd927 Named events really should be expressed with PEIdent
steve authored
333 NetEvWait::NetEvWait(NetProc*pr)
334 : statement_(pr), nevents_(0), events_(0)
30e8289 Simulate named event trigger and waits.
steve authored
335 {
336 }
337
338 NetEvWait::~NetEvWait()
339 {
726f7b8 Synthesis of comparator in expressions.
steve authored
340 if (events_) {
341 for (unsigned idx = 0 ; idx < nevents_ ; idx += 1) {
342 NetEvent*tgt = events_[idx];
343 tgt->waitref_ -= 1;
c1c0168 Globally merge redundant event objects.
steve authored
344
345 struct NetEvent::wcell_*tmp = tgt->wlist_;
346 if (tmp->obj == this) {
347 tgt->wlist_ = tmp->next;
348 delete tmp;
349 } else {
350 assert(tmp->next);
351 while (tmp->next->obj != this) {
352 tmp = tmp->next;
353 assert(tmp->next);
354 }
355 tmp->next = tmp->next->next;
356 delete tmp;
357 }
726f7b8 Synthesis of comparator in expressions.
steve authored
358 }
359 delete[]events_;
360 }
30e8289 Simulate named event trigger and waits.
steve authored
361 delete statement_;
362 }
363
b1fd927 Named events really should be expressed with PEIdent
steve authored
364 void NetEvWait::add_event(NetEvent*tgt)
30e8289 Simulate named event trigger and waits.
steve authored
365 {
b1fd927 Named events really should be expressed with PEIdent
steve authored
366 assert(tgt);
367 if (nevents_ == 0) {
368 events_ = new NetEvent*[1];
369
370 } else {
371 NetEvent**tmp = new NetEvent*[nevents_+1];
372 for (unsigned idx = 0 ; idx < nevents_ ; idx += 1) {
373 tmp[idx] = events_[idx];
374 assert(tmp[idx] != tgt);
375 }
376 delete[]events_;
377 events_ = tmp;
378 }
379
380 events_[nevents_] = tgt;
381 nevents_ += 1;
726f7b8 Synthesis of comparator in expressions.
steve authored
382
383 // Remember to tell the NetEvent that there is someone
384 // pointing to it.
385 tgt->waitref_ += 1;
c1c0168 Globally merge redundant event objects.
steve authored
386
387 struct NetEvent::wcell_*tmp = new NetEvent::wcell_;
388 tmp->obj = this;
389 tmp->next = tgt->wlist_;
390 tgt->wlist_ = tmp;
391 }
392
393 void NetEvWait::replace_event(NetEvent*src, NetEvent*repl)
394 {
395 unsigned idx;
396 for (idx = 0 ; idx < nevents_ ; idx += 1) {
397 if (events_[idx] == src)
398 break;
399 }
400
401 assert(idx < nevents_);
402
403 /* First, remove me from the list held by the src NetEvent. */
404 assert(src->waitref_ > 0);
405 src->waitref_ -= 1;
406 struct NetEvent::wcell_*tmp = src->wlist_;
407 if (tmp->obj == this) {
408 src->wlist_ = tmp->next;
409 delete tmp;
410 } else {
411 assert(tmp->next);
412 while (tmp->next->obj != this) {
413 tmp = tmp->next;
414 assert(tmp->next);
415 }
416 tmp->next = tmp->next->next;
417 delete tmp;
418 }
419
420 events_[idx] = repl;
421
422 // Remember to tell the replacement NetEvent that there is
423 // someone pointing to it.
424 repl->waitref_ += 1;
425
426 tmp = new NetEvent::wcell_;
427 tmp->obj = this;
428 tmp->next = repl->wlist_;
429 repl->wlist_ = tmp;
430
b1fd927 Named events really should be expressed with PEIdent
steve authored
431 }
432
433 unsigned NetEvWait::nevents() const
434 {
435 return nevents_;
436 }
437
438 const NetEvent* NetEvWait::event(unsigned idx) const
439 {
440 assert(idx < nevents_);
441 return events_[idx];
30e8289 Simulate named event trigger and waits.
steve authored
442 }
443
4493e96 Finally remove the NetNEvent and NetPEvent classes,
steve authored
444 NetEvent* NetEvWait::event(unsigned idx)
445 {
446 assert(idx < nevents_);
447 return events_[idx];
448 }
449
450 NetProc* NetEvWait::statement()
451 {
452 return statement_;
453 }
454
30e8289 Simulate named event trigger and waits.
steve authored
455 /*
456 * $Log: net_event.cc,v $
c7d97f4 Properly evaluate scope path expressions.
steve authored
457 * Revision 1.27 2007/06/02 03:42:13 steve
458 * Properly evaluate scope path expressions.
459 *
e4ae832 Clean up spurious trailing white space.
steve authored
460 * Revision 1.26 2004/10/04 01:10:54 steve
461 * Clean up spurious trailing white space.
462 *
536068b Memory and Event names use perm_string.
steve authored
463 * Revision 1.25 2004/02/19 06:57:10 steve
464 * Memory and Event names use perm_string.
465 *
27af95d Use perm_strings for named langiage items.
steve authored
466 * Revision 1.24 2004/02/18 17:11:56 steve
467 * Use perm_strings for named langiage items.
468 *
f1cc9d8 Support event names as expressions elements.
steve authored
469 * Revision 1.23 2003/04/22 04:48:29 steve
470 * Support event names as expressions elements.
471 *
badad63 All NetObj objects have lex_string base names.
steve authored
472 * Revision 1.22 2003/03/06 00:28:41 steve
473 * All NetObj objects have lex_string base names.
474 *
4c67de5 Add the lex_strings string handler, and put
steve authored
475 * Revision 1.21 2003/03/01 06:25:30 steve
476 * Add the lex_strings string handler, and put
477 * scope names and system task/function names
478 * into this table. Also, permallocate event
479 * names from the beginning.
480 *
52bf4e6 conditional ident string using autoconfig.
steve authored
481 * Revision 1.20 2002/08/12 01:34:59 steve
482 * conditional ident string using autoconfig.
483 *
58ec62c Rewrite find_similar_event to support doing
steve authored
484 * Revision 1.19 2002/07/24 16:24:45 steve
485 * Rewrite find_similar_event to support doing
486 * all event matching and replacement in one
487 * shot, saving time in the scans.
488 *
9b6b081 Add structure for asynchronous logic synthesis.
steve authored
489 * Revision 1.18 2002/06/30 02:21:31 steve
490 * Add structure for asynchronous logic synthesis.
491 *
54dab22 event find_similar should not find self.
steve authored
492 * Revision 1.17 2002/02/02 06:13:38 steve
493 * event find_similar should not find self.
494 *
874bab1 NetObj constructor finally requires a scope.
steve authored
495 * Revision 1.16 2001/10/28 01:14:53 steve
496 * NetObj constructor finally requires a scope.
497 *
b825f8d Create a config.h.in file to hold all the config
steve authored
498 * Revision 1.15 2001/07/25 03:10:49 steve
499 * Create a config.h.in file to hold all the config
500 * junk, and support gcc 3.0. (Stephan Boettcher)
501 *
ad8565f Add const probe method to NetEvent.
steve authored
502 * Revision 1.14 2001/03/29 02:52:19 steve
503 * Add const probe method to NetEvent.
504 *
a4e528f Add the ivl_event_t to ivl_target, and use that to generate
steve authored
505 * Revision 1.13 2001/03/28 06:07:39 steve
506 * Add the ivl_event_t to ivl_target, and use that to generate
507 * .event statements in vvp way ahead of the thread that uses it.
508 *
bcbd5b2 Remove limits from the similar events search.
steve authored
509 * Revision 1.12 2000/12/15 17:45:07 steve
510 * Remove limits from the similar events search.
511 *
aac5fc2 Use char8 instead of string to store name.
steve authored
512 * Revision 1.11 2000/10/04 16:30:39 steve
513 * Use char8 instead of string to store name.
514 *
ea53f2b Typo stepping ot next probe in delete.
steve authored
515 * Revision 1.10 2000/09/19 03:00:36 steve
516 * Typo stepping ot next probe in delete.
517 *
39c71ef fix problem coalescing events w/ probes.
steve authored
518 * Revision 1.9 2000/07/29 03:55:38 steve
519 * fix problem coalescing events w/ probes.
520 *
c1c0168 Globally merge redundant event objects.
steve authored
521 * Revision 1.8 2000/05/31 02:26:49 steve
522 * Globally merge redundant event objects.
523 *
fd09bc3 Merge similar probes within a module.
steve authored
524 * Revision 1.7 2000/05/27 19:33:23 steve
525 * Merge similar probes within a module.
526 *
74c4303 Clean up unneeded NetEvent objects.
steve authored
527 * Revision 1.6 2000/04/18 04:50:20 steve
528 * Clean up unneeded NetEvent objects.
529 *
726f7b8 Synthesis of comparator in expressions.
steve authored
530 * Revision 1.5 2000/04/16 23:32:18 steve
531 * Synthesis of comparator in expressions.
532 *
533 * Connect the NetEvent and related classes
534 * together better.
535 *
4493e96 Finally remove the NetNEvent and NetPEvent classes,
steve authored
536 * Revision 1.4 2000/04/12 20:02:53 steve
537 * Finally remove the NetNEvent and NetPEvent classes,
538 * Get synthesis working with the NetEvWait class,
539 * and get started supporting multiple events in a
540 * wait in vvm.
541 *
b1fd927 Named events really should be expressed with PEIdent
steve authored
542 * Revision 1.3 2000/04/12 04:23:58 steve
543 * Named events really should be expressed with PEIdent
544 * objects in the pform,
545 *
546 * Handle named events within the mix of net events
547 * and edges. As a unified lot they get caught together.
548 * wait statements are broken into more complex statements
549 * that include a conditional.
550 *
551 * Do not generate NetPEvent or NetNEvent objects in
552 * elaboration. NetEvent, NetEvWait and NetEvProbe
553 * take over those functions in the netlist.
554 *
8dbd641 All events now use the NetEvent class.
steve authored
555 * Revision 1.2 2000/04/10 05:26:06 steve
556 * All events now use the NetEvent class.
557 *
30e8289 Simulate named event trigger and waits.
steve authored
558 * Revision 1.1 2000/04/04 03:20:15 steve
559 * Simulate named event trigger and waits.
560 *
561 */
Something went wrong with that request. Please try again.