Skip to content

Commit db19f29

Browse files
user can now convert vertices to ptrs and vice versa
1 parent 1d6355a commit db19f29

File tree

3 files changed

+137
-1
lines changed

3 files changed

+137
-1
lines changed

plugins/clock_tree_extractor/include/clock_tree_extractor/clock_tree.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ namespace hal
7878

7979
Result<igraph_integer_t> get_vertex_from_ptr( const void *ptr ) const;
8080

81+
Result<std::pair<const void *, PtrType>> get_ptr_from_vertex( const igraph_integer_t vertex ) const;
82+
83+
Result<std::vector<igraph_integer_t>> get_vertices_from_ptrs( const std::vector<const void *> &ptrs ) const;
84+
85+
Result<std::vector<std::pair<const void *, PtrType>>>
86+
get_ptrs_from_vertices( const std::vector<igraph_integer_t> &vertices ) const;
87+
8188
const std::vector<const Gate *> get_gates() const;
8289

8390
const std::vector<const Net *> get_nets() const;

plugins/clock_tree_extractor/python/python_bindings.cpp

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,84 @@ namespace hal
162162
return result;
163163
},
164164
R"()" )
165-
.def( "get_vertex_from_ptr", &cte::ClockTree::get_vertex_from_ptr, R"()" )
165+
.def(
166+
"get_vertex_from_ptr",
167+
[]( const cte::ClockTree &self, const void *ptr ) -> py::object {
168+
auto result = self.get_vertex_from_ptr( ptr );
169+
if( result.is_ok() )
170+
{
171+
return py::int_( result.get() );
172+
}
173+
log_error( "clock_tree_extractor", "{}", result.get_error().get() );
174+
return py::none();
175+
},
176+
py::arg( "ptr" ),
177+
R"()" )
178+
.def(
179+
"get_ptr_from_vertex",
180+
[]( const cte::ClockTree &self, const igraph_integer_t vertex ) -> py::object {
181+
auto result = self.get_ptr_from_vertex( vertex );
182+
if( result.is_ok() )
183+
{
184+
auto [ptr, type] = result.get();
185+
if( type == cte::PtrType::GATE )
186+
{
187+
return py::cast( (const Gate *) ptr );
188+
}
189+
else if( type == cte::PtrType::NET )
190+
{
191+
return py::cast( (const Net *) ptr );
192+
}
193+
return py::none();
194+
}
195+
log_error( "clock_tree_extractor", "{}", result.get_error().get() );
196+
return py::none();
197+
},
198+
py::arg( "vertex" ),
199+
R"()" )
200+
.def(
201+
"get_vertices_from_ptrs",
202+
[]( const cte::ClockTree &self, const std::vector<const void *> &ptrs ) -> py::list {
203+
auto result = self.get_vertices_from_ptrs( ptrs );
204+
if( result.is_ok() )
205+
{
206+
return py::cast( result.get() );
207+
}
208+
log_error( "clock_tree_extractor", "{}", result.get_error().get() );
209+
return py::none();
210+
},
211+
py::arg( "ptrs" ),
212+
R"()" )
213+
.def(
214+
"get_ptrs_from_vertices",
215+
[]( const cte::ClockTree &self, const std::vector<igraph_integer_t> &vertices ) -> py::list {
216+
auto res = self.get_ptrs_from_vertices( vertices );
217+
if( res.is_ok() )
218+
{
219+
py::list result;
220+
for( const auto &[ptr, type] : res.get() )
221+
{
222+
if( type == cte::PtrType::GATE )
223+
{
224+
result.append( py::cast( (const Gate *) ptr ) );
225+
}
226+
else if( type == cte::PtrType::NET )
227+
{
228+
result.append( py::cast( (const Net *) ptr ) );
229+
}
230+
else
231+
{
232+
log_error( "clock_tree_extractor", "unknown ptr type" );
233+
return py::none();
234+
}
235+
}
236+
return result;
237+
}
238+
log_error( "clock_tree_extractor", "{}", res.get_error().get() );
239+
return py::none();
240+
},
241+
py::arg( "vertices" ),
242+
R"()" )
166243
.def( "get_gates", &cte::ClockTree::get_gates, R"()" )
167244
.def( "get_nets", &cte::ClockTree::get_nets, R"()" )
168245
.def( "get_netlist", &cte::ClockTree::get_netlist, R"()" );

plugins/clock_tree_extractor/src/clock_tree.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ namespace hal
195195
}
196196
else if( clk->get_num_of_sources() == 0 )
197197
{
198+
log_warning( "clock_tree_extractor",
199+
"unrouted clock net with ID {} ignored",
200+
std::to_string( clk->get_id() ) );
198201
continue;
199202
}
200203

@@ -614,6 +617,55 @@ namespace hal
614617
return OK( it->second );
615618
}
616619

620+
Result<std::pair<const void *, PtrType>> ClockTree::get_ptr_from_vertex( const igraph_integer_t vertex ) const
621+
{
622+
auto it = m_vertices_to_ptrs.find( vertex );
623+
if( it == m_vertices_to_ptrs.end() )
624+
{
625+
return ERR( "object is not part of clock tree" );
626+
}
627+
628+
return OK( std::make_pair( it->second, m_ptrs_to_types.at( it->second ) ) );
629+
}
630+
631+
Result<std::vector<igraph_integer_t>>
632+
ClockTree::get_vertices_from_ptrs( const std::vector<const void *> &ptrs ) const
633+
{
634+
std::vector<igraph_integer_t> result;
635+
636+
for( const void *ptr : ptrs )
637+
{
638+
auto res = get_vertex_from_ptr( ptr );
639+
if( res.is_error() )
640+
{
641+
return ERR( res.get_error().get() );
642+
}
643+
644+
result.push_back( res.get() );
645+
}
646+
647+
return OK( result );
648+
}
649+
650+
Result<std::vector<std::pair<const void *, PtrType>>>
651+
ClockTree::get_ptrs_from_vertices( const std::vector<igraph_integer_t> &vertices ) const
652+
{
653+
std::vector<std::pair<const void *, PtrType>> result;
654+
655+
for( const igraph_integer_t vertex : vertices )
656+
{
657+
auto res = get_ptr_from_vertex( vertex );
658+
if( res.is_error() )
659+
{
660+
return ERR( res.get_error().get() );
661+
}
662+
663+
result.push_back( res.get() );
664+
}
665+
666+
return OK( result );
667+
}
668+
617669
const std::vector<const Gate *> ClockTree::get_gates() const
618670
{
619671
std::vector<const Gate *> result;

0 commit comments

Comments
 (0)