mirror of https://codeberg.org/topola/topola.git
Update `undoredo` to 0.10
This commit is contained in:
parent
272bdb326d
commit
7f67a24808
|
|
@ -12,7 +12,7 @@ derive-getters = "0.5"
|
|||
derive_more = { version = "2.1", features = ["full"] }
|
||||
serde = { version = "1", features = ["derive", "rc"] }
|
||||
thiserror = "2.0"
|
||||
undoredo = { version = "0.8", features = ["stable-vec"] }
|
||||
undoredo = { version = "0.10", features = ["derive", "stable-vec", "rstar"] }
|
||||
|
||||
[profile.release]
|
||||
opt-level = 2 # Fast and small WASM.
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ dearcut = { version = "0.3", features = ["serde", "undoredo"] }
|
|||
derive-getters.workspace = true
|
||||
derive_more.workspace = true
|
||||
i_triangle = "0.40"
|
||||
polygon_unionfind = "0.5"
|
||||
polygon_unionfind = "0.7"
|
||||
rstar = "0.12"
|
||||
serde.workspace = true
|
||||
spade = "2.15"
|
||||
|
|
|
|||
|
|
@ -201,11 +201,11 @@ pub struct BoardHalfDelta {
|
|||
}
|
||||
|
||||
impl ApplyDelta<BoardHalfDelta> for Board {
|
||||
fn apply_delta(&mut self, delta: &Delta<BoardHalfDelta>) {
|
||||
let (removed, inserted) = delta.clone().dissolve();
|
||||
fn apply_delta(&mut self, delta: Delta<BoardHalfDelta>) {
|
||||
let (removed, inserted) = delta.dissolve();
|
||||
|
||||
let layout_delta = Delta::with_removed_inserted(removed.layout, inserted.layout);
|
||||
self.layout.apply_delta(&layout_delta);
|
||||
self.layout.apply_delta(layout_delta);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,13 +16,13 @@ impl Connectivity {
|
|||
pub fn new(board: &Board) -> Self {
|
||||
let mut this = Connectivity {
|
||||
joints_unionfind: UnionFind::with_len(
|
||||
board.layout().joints().collection().num_elements(),
|
||||
board.layout().joints().container().num_elements(),
|
||||
),
|
||||
segments_unionfind: UnionFind::with_len(
|
||||
board.layout().segments().collection().num_elements(),
|
||||
board.layout().segments().container().num_elements(),
|
||||
),
|
||||
polygons_unionfind: UnionFind::with_len(
|
||||
board.layout().polygons().collection().num_elements(),
|
||||
board.layout().polygons().container().num_elements(),
|
||||
),
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@
|
|||
//
|
||||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use derive_getters::{Dissolve, Getters};
|
||||
use derive_getters::Getters;
|
||||
use derive_more::Constructor;
|
||||
use rstar::{
|
||||
AABB, RTree,
|
||||
|
|
@ -12,7 +10,8 @@ use rstar::{
|
|||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use stable_vec::StableVec;
|
||||
use undoredo::{ApplyDelta, Delta, FlushDelta, Recorder};
|
||||
use undoredo::aliases::RTreeHalfDelta;
|
||||
use undoredo::{Delta, Recorder};
|
||||
|
||||
use crate::{
|
||||
Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Vector2, Via, ViaId,
|
||||
|
|
@ -64,12 +63,16 @@ impl NetId {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Getters)]
|
||||
#[derive(Delta, Clone, Debug, Getters)]
|
||||
pub struct Layout {
|
||||
#[undoredo(skip)]
|
||||
boundary: Vec<[i64; 2]>,
|
||||
#[undoredo(skip)]
|
||||
place_boundary: Vec<[i64; 2]>,
|
||||
#[undoredo(skip)]
|
||||
layer_count: usize,
|
||||
|
||||
#[undoredo(skip)]
|
||||
pins: StableVec<Pin>,
|
||||
|
||||
joints: Recorder<StableVec<Joint>>,
|
||||
|
|
@ -77,10 +80,22 @@ pub struct Layout {
|
|||
vias: Recorder<StableVec<Via>>,
|
||||
polygons: Recorder<StableVec<Polygon>>,
|
||||
|
||||
joints_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, JointId>>>,
|
||||
segments_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, SegmentId>>>,
|
||||
vias_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, ViaId>>>,
|
||||
polygons_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, PolygonId>>>,
|
||||
joints_rtree: Recorder<
|
||||
RTree<GeomWithData<Rectangle<[i64; 3]>, JointId>>,
|
||||
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, JointId>>,
|
||||
>,
|
||||
segments_rtree: Recorder<
|
||||
RTree<GeomWithData<Rectangle<[i64; 3]>, SegmentId>>,
|
||||
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, SegmentId>>,
|
||||
>,
|
||||
vias_rtree: Recorder<
|
||||
RTree<GeomWithData<Rectangle<[i64; 3]>, ViaId>>,
|
||||
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, ViaId>>,
|
||||
>,
|
||||
polygons_rtree: Recorder<
|
||||
RTree<GeomWithData<Rectangle<[i64; 3]>, PolygonId>>,
|
||||
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, PolygonId>>,
|
||||
>,
|
||||
}
|
||||
|
||||
impl Layout {
|
||||
|
|
@ -201,7 +216,7 @@ impl Layout {
|
|||
.as_ref()
|
||||
.locate_all_at_point(&[point.x, point.y, layer as i64])
|
||||
.map(|geom_with_data| geom_with_data.data)
|
||||
.filter(move |joint_id| {
|
||||
.filter(move |&joint_id| {
|
||||
self.joints
|
||||
.get(&joint_id.index())
|
||||
.unwrap()
|
||||
|
|
@ -232,7 +247,7 @@ impl Layout {
|
|||
.as_ref()
|
||||
.locate_all_at_point(&[point.x, point.y, layer as i64])
|
||||
.map(|geom_with_data| geom_with_data.data)
|
||||
.filter(move |polygon_id| {
|
||||
.filter(move |&polygon_id| {
|
||||
self.polygons
|
||||
.get(&polygon_id.index())
|
||||
.unwrap()
|
||||
|
|
@ -290,57 +305,3 @@ impl Layout {
|
|||
&self.pins[pin_id.index()]
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Dissolve)]
|
||||
pub struct LayoutHalfDelta {
|
||||
joints: BTreeMap<usize, Joint>,
|
||||
segments: BTreeMap<usize, Segment>,
|
||||
vias: BTreeMap<usize, Via>,
|
||||
polygons: BTreeMap<usize, Polygon>,
|
||||
}
|
||||
|
||||
impl ApplyDelta<LayoutHalfDelta> for Layout {
|
||||
fn apply_delta(&mut self, delta: &Delta<LayoutHalfDelta>) {
|
||||
let (removed, inserted) = delta.clone().dissolve();
|
||||
|
||||
let joints_delta = Delta::with_removed_inserted(removed.joints, inserted.joints);
|
||||
self.joints.apply_delta(&joints_delta);
|
||||
|
||||
let segments_delta = Delta::with_removed_inserted(removed.segments, inserted.segments);
|
||||
self.segments.apply_delta(&segments_delta);
|
||||
|
||||
let vias_delta = Delta::with_removed_inserted(removed.vias, inserted.vias);
|
||||
self.vias.apply_delta(&vias_delta);
|
||||
|
||||
let polygons_delta = Delta::with_removed_inserted(removed.polygons, inserted.polygons);
|
||||
self.polygons.apply_delta(&polygons_delta);
|
||||
|
||||
// TODO R-trees.
|
||||
}
|
||||
}
|
||||
|
||||
impl FlushDelta<LayoutHalfDelta> for Layout {
|
||||
fn flush_delta(&mut self) -> Delta<LayoutHalfDelta> {
|
||||
let (removed_joints, inserted_joints) = self.joints.flush_delta().dissolve();
|
||||
let (removed_segments, inserted_segments) = self.segments.flush_delta().dissolve();
|
||||
let (removed_vias, inserted_vias) = self.vias.flush_delta().dissolve();
|
||||
let (removed_polygons, inserted_polygons) = self.polygons.flush_delta().dissolve();
|
||||
|
||||
// TODO R-trees.
|
||||
|
||||
Delta::with_removed_inserted(
|
||||
LayoutHalfDelta {
|
||||
joints: removed_joints,
|
||||
segments: removed_segments,
|
||||
vias: removed_vias,
|
||||
polygons: removed_polygons,
|
||||
},
|
||||
LayoutHalfDelta {
|
||||
joints: inserted_joints,
|
||||
segments: inserted_segments,
|
||||
vias: inserted_vias,
|
||||
polygons: inserted_polygons,
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use dearcut::{RecordingTriangulator, VertexId};
|
|||
use derive_getters::Getters;
|
||||
use derive_more::Constructor;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use stable_vec::StableVec;
|
||||
use undoredo::Recorder;
|
||||
|
||||
use crate::{Board, Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Vector2};
|
||||
|
|
@ -176,9 +177,9 @@ pub struct NavmesherBoard {
|
|||
navmesher: Navmesher,
|
||||
board: Board,
|
||||
|
||||
joint_multiobstacles: Recorder<Vec<MultiObstacleId>>,
|
||||
segment_multiobstacles: Recorder<Vec<MultiObstacleId>>,
|
||||
polygon_multiobstacles: Recorder<Vec<MultiObstacleId>>,
|
||||
joint_multiobstacles: Recorder<StableVec<MultiObstacleId>>,
|
||||
segment_multiobstacles: Recorder<StableVec<MultiObstacleId>>,
|
||||
polygon_multiobstacles: Recorder<StableVec<MultiObstacleId>>,
|
||||
}
|
||||
|
||||
impl NavmesherBoard {
|
||||
|
|
@ -194,12 +195,12 @@ impl NavmesherBoard {
|
|||
),
|
||||
board,
|
||||
|
||||
joint_multiobstacles: Recorder::new(Vec::new()),
|
||||
segment_multiobstacles: Recorder::new(Vec::new()),
|
||||
polygon_multiobstacles: Recorder::new(Vec::new()),
|
||||
joint_multiobstacles: Recorder::new(StableVec::new()),
|
||||
segment_multiobstacles: Recorder::new(StableVec::new()),
|
||||
polygon_multiobstacles: Recorder::new(StableVec::new()),
|
||||
};
|
||||
|
||||
for (i, joint) in this.board.layout().joints().collection() {
|
||||
for (i, joint) in this.board.layout().joints().container().iter() {
|
||||
this.joint_multiobstacles.insert(
|
||||
i,
|
||||
this.navmesher
|
||||
|
|
@ -207,7 +208,7 @@ impl NavmesherBoard {
|
|||
);
|
||||
}
|
||||
|
||||
for (i, segment) in this.board.layout().segments().collection() {
|
||||
for (i, segment) in this.board.layout().segments().container().iter() {
|
||||
this.segment_multiobstacles.insert(
|
||||
i,
|
||||
this.navmesher
|
||||
|
|
@ -215,7 +216,7 @@ impl NavmesherBoard {
|
|||
);
|
||||
}
|
||||
|
||||
for (i, polygon) in this.board.layout().polygons().collection() {
|
||||
for (i, polygon) in this.board.layout().polygons().container().iter() {
|
||||
this.polygon_multiobstacles.insert(
|
||||
i,
|
||||
this.navmesher
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ impl Ratsnest {
|
|||
let mut triangulations: BTreeMap<(NetId, usize), DelaunayTriangulation<DelaunayVertex>> =
|
||||
BTreeMap::new();
|
||||
|
||||
for (i, joint) in board.layout().joints().collection() {
|
||||
for (i, joint) in board.layout().joints().container().iter() {
|
||||
let _ = triangulations
|
||||
.entry((joint.net, joint.layer))
|
||||
.or_insert_with(DelaunayTriangulation::new)
|
||||
|
|
@ -58,7 +58,7 @@ impl Ratsnest {
|
|||
});
|
||||
}
|
||||
|
||||
for (i, segment) in board.layout().segments().collection() {
|
||||
for (i, segment) in board.layout().segments().container().iter() {
|
||||
let segment_center = segment.center();
|
||||
let _ = triangulations
|
||||
.entry((segment.net, segment.layer))
|
||||
|
|
@ -71,7 +71,7 @@ impl Ratsnest {
|
|||
});
|
||||
}
|
||||
|
||||
for (i, polygon) in board.layout().polygons().collection() {
|
||||
for (i, polygon) in board.layout().polygons().container().iter() {
|
||||
let _ = triangulations
|
||||
.entry((polygon.net, polygon.layer))
|
||||
.or_insert_with(DelaunayTriangulation::new)
|
||||
|
|
|
|||
Loading…
Reference in New Issue