@@ -118,11 +118,13 @@ Cell *LutB::GenerateIntoDatabase(const std::string &name) {
118
118
circuit->AddPort (circuit->AddSignal (" CONFIG_IN" ));
119
119
circuit->AddPort (circuit->AddSignal (" CONFIG_OUT" ));
120
120
121
- // FIXME(aryap): There's actually one of these per bank.
122
121
// Clock, power, ground in.
123
122
circuit->AddPort (circuit->AddSignal (" CLK" ));
124
- circuit->AddPort (circuit->AddSignal (" VPWR" ));
125
- circuit->AddPort (circuit->AddSignal (" VGND" ));
123
+ // TODO(aryap): For now there's actually one of these per bank.
124
+ circuit->AddPort (circuit->AddSignal (" VPWR_0" ));
125
+ circuit->AddPort (circuit->AddSignal (" VPWR_1" ));
126
+ circuit->AddPort (circuit->AddSignal (" VGND_0" ));
127
+ circuit->AddPort (circuit->AddSignal (" VGND_1" ));
126
128
127
129
// Layout.
128
130
// ---------------------------------------------------------------------------
@@ -539,6 +541,10 @@ void LutB::RouteClockBuffers(RoutingGrid *routing_grid,
539
541
.instance = clk_buf,
540
542
.port_name = " A"
541
543
});
544
+
545
+ // This matches the input port name, so that the connecting net label
546
+ // matches the incoming port label.
547
+ clk_inputs.net_name = " CLK" ;
542
548
}
543
549
auto result = AddMultiPointRoute (clk_inputs, routing_grid, circuit, layout);
544
550
AccumulateAnyErrors (result);
@@ -677,6 +683,7 @@ void LutB::RouteMuxInputs(
677
683
circuit->GetOrAddSignal (net_names.primary (), 1 );
678
684
memory->circuit_instance ()->Connect (" Q" , *signal);
679
685
mux->circuit_instance ()->Connect (input_name, *signal);
686
+ LOG (INFO) << input_name << " <- " << signal->name ();
680
687
} else {
681
688
// FIXME(aryap): I am stupid. The set of names given to the router to
682
689
// determine which shapes are connectable is different to the target
@@ -692,6 +699,7 @@ void LutB::RouteMuxInputs(
692
699
693
700
circuit::Signal *signal = circuit->GetOrAddSignal (target_net, 1 );
694
701
mux->circuit_instance ()->Connect (input_name, *signal);
702
+ LOG (INFO) << input_name << " <- " << signal->name ();
695
703
}
696
704
if (route_result.ok ()) {
697
705
path_found = true ;
@@ -744,7 +752,7 @@ void LutB::RouteRemainder(
744
752
}, {
745
753
.port_keys = {{mux_order_[1 ], " Z" }, {active_mux2s_[0 ], " A1" }},
746
754
}, {
747
- .port_keys = {{active_mux2s_[0 ], " X" }, {buf_order_[3 ], " A " }},
755
+ .port_keys = {{active_mux2s_[0 ], " X" }, {buf_order_[3 ], " P " }},
748
756
}
749
757
};
750
758
@@ -753,16 +761,24 @@ void LutB::RouteRemainder(
753
761
collection, routing_grid, circuit, layout);
754
762
AccumulateAnyErrors (result);
755
763
}
764
+
765
+ // FIXME(aryap): Make circuit-only connections (this is fake).
766
+ for (size_t i = 0 ; i < buf_order_.size (); ++i) {
767
+ std::string port_name = absl::StrCat (" S" , i);
768
+ circuit::Signal *signal = circuit->GetOrAddSignal (port_name, 1 );
769
+
770
+ buf_order_[i]->circuit_instance ()->Connect (" A" , *signal);
771
+ }
756
772
}
757
773
758
774
// TODO(aryap): This clearly needs to be factored out of this class.
759
775
absl::Status LutB::AddMultiPointRoute (const PortKeyCollection &collection,
760
776
RoutingGrid *routing_grid,
761
777
Circuit *circuit,
762
778
Layout *layout) const {
763
- circuit::Wire internal_wire = circuit->AddSignal (
764
- collection.net_name ? *collection.net_name : " " );
765
- std::string net = internal_wire. signal (). name ();
779
+ circuit::Signal *internal_signal = circuit->GetOrAddSignal (
780
+ collection.net_name ? *collection.net_name : " " , 1 );
781
+ std::string net = internal_signal-> name ();
766
782
767
783
std::vector<std::vector<geometry::Port*>> route_targets;
768
784
for (auto &port_key : collection.port_keys ) {
@@ -771,7 +787,7 @@ absl::Status LutB::AddMultiPointRoute(const PortKeyCollection &collection,
771
787
geometry::Instance *instance = port_key.instance ;
772
788
773
789
circuit::Instance *circuit_instance = instance->circuit_instance ();
774
- circuit_instance->Connect (port_key.port_name , internal_wire );
790
+ circuit_instance->Connect (port_key.port_name , *internal_signal );
775
791
776
792
std::vector<geometry::Port*> matching_ports;
777
793
instance->GetInstancePorts (port_key.port_name , &matching_ports);
@@ -900,6 +916,9 @@ void LutB::AddClockAndPowerStraps(
900
916
static const std::array<std::string, 4 > kNets =
901
917
{" vpwr" , " vgnd" , " clk" , " clk_i" };
902
918
919
+ static const std::array<std::string, 2 > kCircuitOnlyPorts = {" VPB" , " VNB" };
920
+ static const std::array<std::string, 2 > kCircuitOnlyPortNets = {" vpwr" , " vgnd" };
921
+
903
922
constexpr int64_t kOffsetNumPitches = 0 ;
904
923
905
924
// FIXME(aryap): We are leaking technology-specific concerns into what was
@@ -986,6 +1005,23 @@ void LutB::AddClockAndPowerStraps(
986
1005
layout);
987
1006
routing_grid->AddBlockages (new_shapes);
988
1007
}
1008
+
1009
+ // Connect circuit-only ports.
1010
+ for (size_t i = 0 ; i < kCircuitOnlyPorts .size (); ++i) {
1011
+ std::string net = absl::StrCat (kCircuitOnlyPortNets [i], " _" , bank);
1012
+ circuit::Signal *signal = circuit->GetOrAddSignal (net, 1 );
1013
+ const std::string &port_name = kCircuitOnlyPorts [i];
1014
+
1015
+ for (const auto &row : banks_.at (bank).instances ()) {
1016
+ for (geometry::Instance *instance : row) {
1017
+ circuit::Instance *circuit_instance = instance->circuit_instance ();
1018
+ if (!circuit_instance) {
1019
+ continue ;
1020
+ }
1021
+ circuit_instance->Connect (port_name, *signal);
1022
+ }
1023
+ }
1024
+ }
989
1025
}
990
1026
}
991
1027
0 commit comments