|
15 | 15 | "FragmentTransformer", |
16 | 16 | "TransformedElaboratable", |
17 | 17 | "DomainCollector", "DomainRenamer", "DomainLowerer", |
18 | | - "SampleDomainInjector", "SampleLowerer", |
19 | 18 | "SwitchCleaner", "LHSGroupAnalyzer", "LHSGroupFilter", |
20 | 19 | "ResetInserter", "EnableInserter"] |
21 | 20 |
|
@@ -65,10 +64,6 @@ def on_Cat(self, value): |
65 | 64 | def on_ArrayProxy(self, value): |
66 | 65 | pass # :nocov: |
67 | 66 |
|
68 | | - @abstractmethod |
69 | | - def on_Sample(self, value): |
70 | | - pass # :nocov: |
71 | | - |
72 | 67 | @abstractmethod |
73 | 68 | def on_Initial(self, value): |
74 | 69 | pass # :nocov: |
@@ -103,8 +98,6 @@ def on_value(self, value): |
103 | 98 | new_value = self.on_Cat(value) |
104 | 99 | elif type(value) is ArrayProxy: |
105 | 100 | new_value = self.on_ArrayProxy(value) |
106 | | - elif type(value) is Sample: |
107 | | - new_value = self.on_Sample(value) |
108 | 101 | elif type(value) is Initial: |
109 | 102 | new_value = self.on_Initial(value) |
110 | 103 | else: |
@@ -153,9 +146,6 @@ def on_ArrayProxy(self, value): |
153 | 146 | return ArrayProxy([self.on_value(elem) for elem in value._iter_as_values()], |
154 | 147 | self.on_value(value.index)) |
155 | 148 |
|
156 | | - def on_Sample(self, value): |
157 | | - return Sample(self.on_value(value.value), value.clocks, value.domain) |
158 | | - |
159 | 149 | def on_Initial(self, value): |
160 | 150 | return value |
161 | 151 |
|
@@ -369,9 +359,6 @@ def on_ArrayProxy(self, value): |
369 | 359 | self.on_value(elem) |
370 | 360 | self.on_value(value.index) |
371 | 361 |
|
372 | | - def on_Sample(self, value): |
373 | | - self.on_value(value.value) |
374 | | - |
375 | 362 | def on_Initial(self, value): |
376 | 363 | pass |
377 | 364 |
|
@@ -509,81 +496,6 @@ def on_fragment(self, fragment): |
509 | 496 | return new_fragment |
510 | 497 |
|
511 | 498 |
|
512 | | -class SampleDomainInjector(ValueTransformer, StatementTransformer): |
513 | | - def __init__(self, domain): |
514 | | - self.domain = domain |
515 | | - |
516 | | - @_ignore_deprecated |
517 | | - def on_Sample(self, value): |
518 | | - if value.domain is not None: |
519 | | - return value |
520 | | - return Sample(value.value, value.clocks, self.domain) |
521 | | - |
522 | | - def __call__(self, stmts): |
523 | | - return self.on_statement(stmts) |
524 | | - |
525 | | - |
526 | | -class SampleLowerer(FragmentTransformer, ValueTransformer, StatementTransformer): |
527 | | - def __init__(self): |
528 | | - self.initial = None |
529 | | - self.sample_cache = None |
530 | | - self.sample_stmts = None |
531 | | - |
532 | | - def _name_reset(self, value): |
533 | | - if isinstance(value, Const): |
534 | | - return f"c${value.value}", value.value |
535 | | - elif isinstance(value, Signal): |
536 | | - return f"s${value.name}", value.reset |
537 | | - elif isinstance(value, ClockSignal): |
538 | | - return "clk", 0 |
539 | | - elif isinstance(value, ResetSignal): |
540 | | - return "rst", 1 |
541 | | - elif isinstance(value, Initial): |
542 | | - return "init", 0 # Past(Initial()) produces 0, 1, 0, 0, ... |
543 | | - else: |
544 | | - raise NotImplementedError # :nocov: |
545 | | - |
546 | | - @_ignore_deprecated |
547 | | - def on_Sample(self, value): |
548 | | - if value in self.sample_cache: |
549 | | - return self.sample_cache[value] |
550 | | - |
551 | | - sampled_value = self.on_value(value.value) |
552 | | - if value.clocks == 0: |
553 | | - sample = sampled_value |
554 | | - else: |
555 | | - assert value.domain is not None |
556 | | - sampled_name, sampled_reset = self._name_reset(value.value) |
557 | | - name = f"$sample${sampled_name}${value.domain}${value.clocks}" |
558 | | - sample = Signal.like(value.value, name=name, reset_less=True, reset=sampled_reset) |
559 | | - sample.attrs["amaranth.sample_reg"] = True |
560 | | - |
561 | | - prev_sample = self.on_Sample(Sample(sampled_value, value.clocks - 1, value.domain)) |
562 | | - if value.domain not in self.sample_stmts: |
563 | | - self.sample_stmts[value.domain] = [] |
564 | | - self.sample_stmts[value.domain].append(sample.eq(prev_sample)) |
565 | | - |
566 | | - self.sample_cache[value] = sample |
567 | | - return sample |
568 | | - |
569 | | - def on_Initial(self, value): |
570 | | - if self.initial is None: |
571 | | - self.initial = Signal(name="init") |
572 | | - return self.initial |
573 | | - |
574 | | - def map_statements(self, fragment, new_fragment): |
575 | | - self.initial = None |
576 | | - self.sample_cache = ValueDict() |
577 | | - self.sample_stmts = OrderedDict() |
578 | | - new_fragment.add_statements(map(self.on_statement, fragment.statements)) |
579 | | - for domain, stmts in self.sample_stmts.items(): |
580 | | - new_fragment.add_statements(stmts) |
581 | | - for stmt in stmts: |
582 | | - new_fragment.add_driver(stmt.lhs, domain) |
583 | | - if self.initial is not None: |
584 | | - new_fragment.add_subfragment(Instance("$initstate", o_Y=self.initial)) |
585 | | - |
586 | | - |
587 | 499 | class SwitchCleaner(StatementVisitor): |
588 | 500 | def on_ignore(self, stmt): |
589 | 501 | return stmt |
|
0 commit comments