@@ -49,6 +49,47 @@ Opendp::MasterByImplant Opendp::splitByImplant(
4949 return mapping;
5050}
5151
52+ dbMasterSeq Opendp::filterFillerMasters (const dbMasterSeq& filler_masters) const
53+ {
54+ // Remove fillers that cannot be used
55+ dbMasterSeq filtered_masters = filler_masters;
56+
57+ if (logger_->debugCheck (DPL, " filler" , 2 )) {
58+ debugPrint (logger_,
59+ DPL,
60+ " filler" ,
61+ 1 ,
62+ " Starting fillers: {}" ,
63+ filtered_masters.size ()) for (auto * master : filtered_masters)
64+ {
65+ debugPrint (logger_, DPL, " filler" , 2 , " {}" , master->getName ());
66+ }
67+ }
68+
69+ // Remove fillers with PAD or BLOCK classes
70+ filtered_masters.erase (std::remove_if (filtered_masters.begin (),
71+ filtered_masters.end (),
72+ [](dbMaster* master) -> bool {
73+ return master->isPad ()
74+ || master->isBlock ();
75+ }),
76+ filtered_masters.end ());
77+
78+ if (logger_->debugCheck (DPL, " filler" , 2 )) {
79+ debugPrint (logger_,
80+ DPL,
81+ " filler" ,
82+ 1 ,
83+ " Final filterered fillers: {}" ,
84+ filtered_masters.size ()) for (auto * master : filtered_masters)
85+ {
86+ debugPrint (logger_, DPL, " filler" , 2 , " {}" , master->getName ());
87+ }
88+ }
89+
90+ return filtered_masters;
91+ }
92+
5293void Opendp::fillerPlacement (const dbMasterSeq& filler_masters,
5394 const char * prefix,
5495 bool verbose)
@@ -58,7 +99,9 @@ void Opendp::fillerPlacement(const dbMasterSeq& filler_masters,
5899 adjustNodesOrient ();
59100 }
60101
61- auto filler_masters_by_implant = splitByImplant (filler_masters);
102+ const auto filtered_masters = filterFillerMasters (filler_masters);
103+
104+ auto filler_masters_by_implant = splitByImplant (filtered_masters);
62105
63106 for (auto & [layer, masters] : filler_masters_by_implant) {
64107 std::sort (masters.begin (),
0 commit comments