@@ -119,15 +119,46 @@ class WithSingleClockBroadcastClockGenerator(freqMHz: Int = 100) extends Overrid
119119
120120 clockGroupsSourceNode.out.foreach { case (bundle, edge) =>
121121 bundle.member.data.foreach { b =>
122- b.clock := clock_io
123- b.reset := reset_io
122+ b.clock := clock_wire
123+ b.reset := reset_wire
124124 }
125125 }
126126 (Seq (ClockPort (() => clock_io, freqMHz), ResetPort (() => reset_io)), clockIOCell ++ resetIOCell)
127127 }
128128 }
129129})
130130
131+ class WithMultiIOCellsClockGenerator extends OverrideLazyIOBinder ({
132+ (system : HasChipyardPRCI ) => {
133+ implicit val p = GetSystemParameters (system)
134+
135+ val clockGroupsSourceNode = ClockGroupSourceNode (Seq (ClockGroupSourceParameters ()))
136+ system.chiptopClockGroupsNode :*= clockGroupsSourceNode
137+
138+ InModuleBody {
139+ val reset_wire = Wire (Input (AsyncReset ()))
140+ val (reset_io, resetIOCell) = IOCell .generateIOFromSignal(reset_wire, " reset" , p(IOCellKey ))
141+
142+ require(clockGroupsSourceNode.out.size == 1 )
143+ val (bundle, edge) = clockGroupsSourceNode.out.head
144+
145+ val iosAndIOCells = (bundle.member.data zip edge.sink.members).map { case (b, m) =>
146+ require(m.take.isDefined, s """ Clock ${m.name.get} has no requested frequency
147+ |Clocks: ${edge.sink.members.map(_.name.get)}""" .stripMargin)
148+ val freq = m.take.get.freqMHz
149+ val clock_wire = Wire (Input (Clock ()))
150+ val (clock_io, clockIOCell) = IOCell .generateIOFromSignal(clock_wire, s " clock_ ${m.name.get}" , p(IOCellKey ))
151+ b.clock := clock_wire
152+ b.reset := reset_wire
153+ (ClockPort (() => clock_io, freq), clockIOCell)
154+ }.toSeq
155+ val clock_ios = iosAndIOCells.map(_._1)
156+ val clockIOCells = iosAndIOCells.flatMap(_._2)
157+ ((clock_ios :+ ResetPort (() => reset_io)), clockIOCells ++ resetIOCell)
158+ }
159+ }
160+ })
161+
131162class WithClockTapIOCells extends OverrideIOBinder ({
132163 (system : CanHaveClockTap ) => {
133164 system.clockTapIO.map { tap =>
0 commit comments