Skip to content

Commit

Permalink
add relays, apply clippy fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Ved-s committed May 11, 2024
1 parent cb0d01d commit 4182bf0
Show file tree
Hide file tree
Showing 15 changed files with 1,332 additions and 54 deletions.
1 change: 1 addition & 0 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ impl App {
Box::new(circuits::gates::not::NotPreview {}),
Box::new(circuits::pullup::PullupPreview {}),
Box::new(circuits::transistor::TransistorPreview {}),
Box::new(circuits::relay::RelayPreview {}),
Box::new(circuits::freq_meter::FreqMeterPreview {}),
Box::new(circuits::pin::Preview {}),
Box::new(circuits::bundler::Preview {}),
Expand Down
9 changes: 6 additions & 3 deletions src/circuits/board.rs
Original file line number Diff line number Diff line change
Expand Up @@ -437,8 +437,8 @@ impl CircuitImpl for Board {
.map(|d| d.to_info())
.collect::<Vec<_>>()
.into_boxed_slice();
self.pins = pins.clone();
pins
self.pins = pins;
self.pins.clone()
}

fn update_signals(&self, state_ctx: &CircuitStateContext, changed_pin: Option<usize>) {
Expand Down Expand Up @@ -640,7 +640,10 @@ impl CircuitImpl for Board {
info.pins = pins.into_boxed_slice();
info.size = design.size;

self.pins = info.pins.clone();
#[allow(clippy::assigning_clones)] // clippy, you're weird
{
self.pins = info.pins.clone();
}

let mut controls: Vec<_> = design.controls.keys().copied().collect();
controls.sort();
Expand Down
62 changes: 58 additions & 4 deletions src/circuits/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use crate::{
containers::FixedVec,
error::ErrorList,
io::{CircuitCopyData, CircuitDesignControlCopy},
state::{CircuitState, InternalCircuitState, State, StateCollection, VisitedList, WireState},
state::{CircuitState, InternalCircuitState, State, StateCollection, VisitedItem, VisitedList, WireState},
string::StringFormatterState,
time::Instant,
unwrap_option_or_continue,
Expand All @@ -37,6 +37,7 @@ pub mod pin;
pub mod props;
pub mod clock;
pub mod pullup;
pub mod relay;
pub mod transistor;

// so templates are always valid
Expand Down Expand Up @@ -210,6 +211,10 @@ impl CircuitPinInfo {
.unwrap_or_default()
}

pub fn connected_wire(&self) -> Option<usize> {
self.pin.read().connected_wire()
}

pub fn connected_wire_color(
&self,
state_ctx: &CircuitStateContext,
Expand Down Expand Up @@ -251,6 +256,13 @@ impl CircuitPinInfo {
}
}

/// Writes this state into pin's state, without triggering any updates
pub fn set_raw_state(&self, state_ctx: &CircuitStateContext, value: WireState) {
state_ctx.write_circuit_state(|cs| {
cs.pins.set(self.pin.read().id.id, value);
});
}

pub fn get_direction(&self, state_ctx: &CircuitStateContext) -> PinDirection {
self.pin.read().direction(&state_ctx.global_state)
}
Expand Down Expand Up @@ -294,6 +306,34 @@ impl CircuitPinInfo {
},
}
}

fn mutate_wire_state(
&self,
ctx: &CircuitStateContext,
state: &mut WireState,
visited_items: &mut VisitedList,
) {
let Some(wire) = self.connected_wire() else { return; };

visited_items.push(ctx.circuit.board.uid, VisitedItem::Pin(self.pin.read().id));
ctx.global_state.compute_wire_state(wire, state, visited_items);
visited_items.pop(ctx.circuit.board.uid);
}

fn apply_wire_state(
&self,
ctx: &CircuitStateContext,
state: &WireState,
skip_state_ckeck: bool,
visited_items: &mut VisitedList,
) {
self.set_raw_state(ctx, state.clone());
let Some(wire) = self.connected_wire() else { return; };

visited_items.push(ctx.circuit.board.uid, VisitedItem::Pin(self.pin.read().id));
ctx.global_state.apply_wire_state(wire, state, skip_state_ckeck, visited_items);
visited_items.pop(ctx.circuit.board.uid);
}
}

impl CircuitPinInfo {
Expand Down Expand Up @@ -861,6 +901,17 @@ impl CircuitPinDescription {
)),
}
}

pub fn new_unused() -> Self {
Self {
active: false,
display_name: "".into(),
display_dir: None,
dir: InternalPinDirection::Inside,
name: "".into(),
pos: [0, 0].into(),
}
}
}

impl<const P: usize> CircuitDescription<P> {
Expand Down Expand Up @@ -908,7 +959,7 @@ macro_rules! describe_directional_circuit {
$(
$pin_name:literal:
$pin_dir:expr,
$pin_dname:literal,
$pin_dname:expr,
$pin_ddir:expr,
[$pin_x:expr, $pin_y: expr]
$(, active: $active:expr)?
Expand Down Expand Up @@ -942,7 +993,11 @@ macro_rules! describe_directional_circuit {
display_name: $pin_dname.into(),
display_dir: Option::<Direction4>::from($pin_ddir)
.map(|d| d.rotate_clockwise_by(dir_normalized)),
pos: $crate::circuits::rotate_pos([$pin_x, $pin_y], size_rotated, dir_normalized).into(),
pos: if expr_or_default!($($active)?, true) {
$crate::circuits::rotate_pos([$pin_x, $pin_y], size_rotated, dir_normalized).into()
} else {
[0, 0].into()
}
},
)*
]
Expand All @@ -957,7 +1012,6 @@ macro_rules! describe_directional_custom_circuit {
(
default_dir: $default_dir:expr,
dir: $dir:expr,
flip: $flip:expr,
size: [$width:expr, $height: expr],

$(
Expand Down
18 changes: 16 additions & 2 deletions src/circuits/props.rs
Original file line number Diff line number Diff line change
Expand Up @@ -756,11 +756,25 @@ where

#[macro_export]
macro_rules! create_safe_prop_enums {
( $( #[default($default:ident)] $(#[$meta:meta])* enum $name:ident { $($variant:ident($varrep:literal $(, $varname:literal)?),)* } )*) => {
(
$(
#[default($default:ident)]
$(#[$meta:meta])*
enum $name:ident {
$(
$(#[$varmeta:meta])*
$variant:ident($varrep:literal $(, $varname:literal)?),
)*
}
)*
) => {
$(
$(#[$meta])*
enum $name {
$($variant),*
$(
$(#[$varmeta])*
$variant
),*
}

impl $crate::circuits::props::CircuitPropertyImpl for $name {
Expand Down
Loading

0 comments on commit 4182bf0

Please sign in to comment.