mirror of https://codeberg.org/topola/topola.git
Compare commits
2 Commits
d77be1b0b3
...
4afd0d7e3d
| Author | SHA1 | Date |
|---|---|---|
|
|
4afd0d7e3d | |
|
|
5113f30fd5 |
|
|
@ -6,9 +6,9 @@ use bimap::BiBTreeMap;
|
|||
use derive_getters::{Dissolve, Getters};
|
||||
use undoredo::{ApplyDelta, Delta, FlushDelta};
|
||||
|
||||
use crate::layout::{
|
||||
Joint, JointId, Layout, LayoutHalfDelta, NetId, PinId, Polygon, PolygonId, Segment, SegmentId,
|
||||
Via, ViaId,
|
||||
use crate::{
|
||||
layout::{Layout, LayoutHalfDelta, NetId, PinId},
|
||||
primitives::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId},
|
||||
};
|
||||
|
||||
#[derive(Clone, Debug, Getters)]
|
||||
|
|
|
|||
|
|
@ -5,19 +5,19 @@
|
|||
use std::collections::BTreeMap;
|
||||
|
||||
use derive_getters::{Dissolve, Getters};
|
||||
use derive_more::Constructor;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use stable_vec::StableVec;
|
||||
use undoredo::{ApplyDelta, Delta, FlushDelta, Recorder};
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
use crate::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId};
|
||||
|
||||
#[derive(
|
||||
Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize,
|
||||
)]
|
||||
pub struct PinId(usize);
|
||||
|
||||
impl PinId {
|
||||
/// Wrap a pin index in a newtype struct.
|
||||
#[inline]
|
||||
pub fn new(id: usize) -> Self {
|
||||
Self(id)
|
||||
}
|
||||
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
|
|
@ -44,16 +44,12 @@ impl Pin {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
#[derive(
|
||||
Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize,
|
||||
)]
|
||||
pub struct NetId(usize);
|
||||
|
||||
impl NetId {
|
||||
/// Wrap a joint index in a newtype struct.
|
||||
#[inline]
|
||||
pub fn new(id: usize) -> Self {
|
||||
Self(id)
|
||||
}
|
||||
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
|
|
@ -61,109 +57,6 @@ impl NetId {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
pub struct JointId(usize);
|
||||
|
||||
impl JointId {
|
||||
/// Wrap a joint index in a newtype struct.
|
||||
#[inline]
|
||||
pub fn new(id: usize) -> Self {
|
||||
Self(id)
|
||||
}
|
||||
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Joint {
|
||||
pub position: [i64; 2],
|
||||
pub layer: usize,
|
||||
pub radius: u64,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
pub struct SegmentId(usize);
|
||||
|
||||
impl SegmentId {
|
||||
/// Wrap a segment index in a newtype struct.
|
||||
#[inline]
|
||||
pub fn new(id: usize) -> Self {
|
||||
Self(id)
|
||||
}
|
||||
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Segment {
|
||||
pub endjoints: [JointId; 2],
|
||||
pub layer: usize,
|
||||
pub half_width: u64,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
pub struct ViaId(usize);
|
||||
|
||||
impl ViaId {
|
||||
/// Wrap a via index in a newtype struct.
|
||||
#[inline]
|
||||
pub fn new(id: usize) -> Self {
|
||||
Self(id)
|
||||
}
|
||||
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Via {
|
||||
pub endpoints: [JointId; 2],
|
||||
pub layer: usize,
|
||||
pub radius: u64,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
pub struct PolygonId(usize);
|
||||
|
||||
impl PolygonId {
|
||||
/// Wrap a polygon index in a newtype struct.
|
||||
#[inline]
|
||||
pub fn new(id: usize) -> Self {
|
||||
Self(id)
|
||||
}
|
||||
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Polygon {
|
||||
pub vertices: Vec<[i64; 2]>,
|
||||
pub layer: usize,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Getters)]
|
||||
pub struct Layout {
|
||||
boundary: Vec<[i64; 2]>,
|
||||
|
|
|
|||
|
|
@ -6,10 +6,11 @@ mod board;
|
|||
mod layout;
|
||||
mod math;
|
||||
mod navmesher;
|
||||
mod primitives;
|
||||
mod selection;
|
||||
mod specctra;
|
||||
|
||||
pub use crate::board::Board;
|
||||
pub use crate::layout::{
|
||||
Joint, JointId, Layout, Polygon, PolygonId, Segment, SegmentId, Via, ViaId,
|
||||
};
|
||||
pub use crate::layout::Layout;
|
||||
pub use crate::navmesher::NavmesherBoard;
|
||||
pub use crate::primitives::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId};
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ use derive_getters::Getters;
|
|||
|
||||
use crate::{
|
||||
Board,
|
||||
layout::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId},
|
||||
primitives::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId},
|
||||
};
|
||||
|
||||
#[derive(Clone, Debug, Getters)]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,142 @@
|
|||
// SPDX-FileCopyrightText: 2026 Topola contributors
|
||||
//
|
||||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||
|
||||
use derive_more::{Constructor, From};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
layout::{NetId, PinId},
|
||||
selection::PinSelector,
|
||||
};
|
||||
|
||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, From, Ord, PartialEq, PartialOrd, Serialize)]
|
||||
pub enum PrimitiveId {
|
||||
Joint(JointId),
|
||||
Segment(SegmentId),
|
||||
Via(ViaId),
|
||||
Polygon(PolygonId),
|
||||
}
|
||||
|
||||
#[derive(
|
||||
Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize,
|
||||
)]
|
||||
pub struct JointId(usize);
|
||||
|
||||
impl JointId {
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Joint {
|
||||
pub position: [i64; 2],
|
||||
pub layer: usize,
|
||||
pub radius: u64,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
impl Joint {
|
||||
pub fn pin_selector(&self) -> Option<PinSelector> {
|
||||
Some(PinSelector {
|
||||
pin: self.pin?,
|
||||
layer: self.layer,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(
|
||||
Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize,
|
||||
)]
|
||||
pub struct SegmentId(usize);
|
||||
|
||||
impl SegmentId {
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Segment {
|
||||
pub endjoints: [JointId; 2],
|
||||
pub layer: usize,
|
||||
pub half_width: u64,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
impl Segment {
|
||||
pub fn pin_selector(&self) -> Option<PinSelector> {
|
||||
Some(PinSelector {
|
||||
pin: self.pin?,
|
||||
layer: self.layer,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(
|
||||
Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize,
|
||||
)]
|
||||
pub struct ViaId(usize);
|
||||
|
||||
impl ViaId {
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Via {
|
||||
pub endpoints: [JointId; 2],
|
||||
pub layer: usize, // ??? This should be a range.
|
||||
pub radius: u64,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
impl Via {
|
||||
pub fn pin_selector(&self) -> Option<PinSelector> {
|
||||
Some(PinSelector {
|
||||
pin: self.pin?,
|
||||
layer: self.layer,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(
|
||||
Clone, Constructor, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize,
|
||||
)]
|
||||
pub struct PolygonId(usize);
|
||||
|
||||
impl PolygonId {
|
||||
/// Returns the underlying index.
|
||||
#[inline]
|
||||
pub fn id(self) -> usize {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Polygon {
|
||||
pub vertices: Vec<[i64; 2]>,
|
||||
pub layer: usize,
|
||||
pub net: NetId,
|
||||
pub pin: Option<PinId>,
|
||||
}
|
||||
|
||||
impl Polygon {
|
||||
pub fn pin_selector(&self) -> Option<PinSelector> {
|
||||
Some(PinSelector {
|
||||
pin: self.pin?,
|
||||
layer: self.layer,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
// SPDX-FileCopyrightText: 2026 Topola contributors
|
||||
//
|
||||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||
|
||||
use std::collections::BTreeSet;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::layout::PinId;
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
|
||||
pub struct PinSelector {
|
||||
pub pin: PinId,
|
||||
pub layer: usize,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
|
||||
pub struct PinSelection(pub BTreeSet<PinSelector>);
|
||||
|
||||
impl PinSelection {
|
||||
pub fn toggle(&mut self, pin_selector: PinSelector) {
|
||||
if self.0.contains(&pin_selector) {
|
||||
self.0.remove(&pin_selector);
|
||||
} else {
|
||||
self.0.insert(pin_selector);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -13,8 +13,9 @@ use specctra::{
|
|||
use crate::{
|
||||
Segment,
|
||||
board::Board,
|
||||
layout::{Joint, NetId, PinId, Polygon},
|
||||
layout::{NetId, PinId},
|
||||
math::Vector2,
|
||||
primitives::{Joint, Polygon},
|
||||
};
|
||||
|
||||
impl Board {
|
||||
|
|
|
|||
Loading…
Reference in New Issue