create downhill iter wrapper
This commit is contained in:
parent
bc7f7845d2
commit
2ff491c717
@ -52,6 +52,13 @@ namespace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using DownhillIter = decltype(Context(ArchArgs()).getPipsDownhill(WireId()).begin());
|
||||||
|
|
||||||
|
struct DownhillIterWrapper {
|
||||||
|
DownhillIter current;
|
||||||
|
DownhillIter end;
|
||||||
|
};
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
USING_NEXTPNR_NAMESPACE;
|
USING_NEXTPNR_NAMESPACE;
|
||||||
|
|
||||||
@ -255,6 +262,18 @@ extern "C" {
|
|||||||
CellInfo* npnr_portref_cell(const PortRef *const port) { return port->cell; }
|
CellInfo* npnr_portref_cell(const PortRef *const port) { return port->cell; }
|
||||||
Loc npnr_cellinfo_get_location(const CellInfo *const info) { return info->getLocation(); }
|
Loc npnr_cellinfo_get_location(const CellInfo *const info) { return info->getLocation(); }
|
||||||
|
|
||||||
|
void npnr_inc_downhill_iter(DownhillIterWrapper *iter) {
|
||||||
|
++iter->current;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t npnr_deref_downhill_iter(DownhillIterWrapper *iter) {
|
||||||
|
wrap(*iter->current);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool npnr_is_downhill_iter_done(DownhillIterWrapper *iter) {
|
||||||
|
return !(iter->current != iter->end);
|
||||||
|
}
|
||||||
|
|
||||||
extern bool npnr_router_awooter(Context *ctx);
|
extern bool npnr_router_awooter(Context *ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use core::slice;
|
use core::slice;
|
||||||
use std::{collections::HashMap, ffi::CStr, marker::PhantomData};
|
use std::{collections::HashMap, ffi::CStr, marker::PhantomData, os::raw::c_void};
|
||||||
|
|
||||||
use libc::c_char;
|
use libc::c_char;
|
||||||
|
|
||||||
@ -314,6 +314,10 @@ extern "C" {
|
|||||||
|
|
||||||
fn npnr_portref_cell(port: *const PortRef) -> *mut CellInfo;
|
fn npnr_portref_cell(port: *const PortRef) -> *mut CellInfo;
|
||||||
fn npnr_cellinfo_get_location(info: *const CellInfo) -> Loc;
|
fn npnr_cellinfo_get_location(info: *const CellInfo) -> Loc;
|
||||||
|
|
||||||
|
fn npnr_inc_downhill_iter(iter: *mut RawDownhillIter);
|
||||||
|
fn npnr_deref_downhill_iter(iter: *mut RawDownhillIter) -> PipId;
|
||||||
|
fn npnr_is_downhill_iter_done(iter: *mut RawDownhillIter) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Store for the nets of a context.
|
/// Store for the nets of a context.
|
||||||
@ -396,6 +400,29 @@ impl<'a> Iterator for NetSinkWireIter<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
struct RawDownhillIter {
|
||||||
|
content: [u8; 0],
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DownhillPipsIter {
|
||||||
|
iter: *mut RawDownhillIter,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for DownhillPipsIter {
|
||||||
|
type Item = PipId;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if unsafe { npnr_is_downhill_iter_done(self.iter) } {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
let pip = unsafe { npnr_deref_downhill_iter(self.iter) };
|
||||||
|
unsafe { npnr_inc_downhill_iter(self.iter) };
|
||||||
|
Some(pip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! log_info {
|
macro_rules! log_info {
|
||||||
($($t:tt)*) => {
|
($($t:tt)*) => {
|
||||||
let s = std::ffi::CString::new(format!($($t)*)).unwrap();
|
let s = std::ffi::CString::new(format!($($t)*)).unwrap();
|
||||||
|
Loading…
Reference in New Issue
Block a user