1
0
forked from ROMEO/nexosim

Merge pull request #65 from asynchronics/feature/rename_crate

Rename crate to NeXosim
This commit is contained in:
Serge Barral 2024-11-16 12:32:05 +01:00 committed by GitHub
commit a6c3217fdf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
94 changed files with 219 additions and 218 deletions

View File

@ -71,7 +71,7 @@ jobs:
- name: Dry-run cargo test (Loom) - name: Dry-run cargo test (Loom)
run: cargo test --no-run --lib --all-features run: cargo test --no-run --lib --all-features
env: env:
RUSTFLAGS: --cfg asynchronix_loom RUSTFLAGS: --cfg nexosim_loom
miri: miri:
name: Miri name: Miri

View File

@ -4,33 +4,33 @@ on:
workflow_dispatch: workflow_dispatch:
pull_request: pull_request:
paths: paths:
- 'asynchronix/src/channel.rs' - 'nexosim/src/channel.rs'
- 'asynchronix/src/channel/**' - 'nexosim/src/channel/**'
- 'asynchronix/src/executor/task.rs' - 'nexosim/src/executor/task.rs'
- 'asynchronix/src/executor/task/**' - 'nexosim/src/executor/task/**'
- 'asynchronix/src/loom_exports.rs' - 'nexosim/src/loom_exports.rs'
- 'asynchronix/src/ports/output/broadcaster.rs' - 'nexosim/src/ports/output/broadcaster.rs'
- 'asynchronix/src/ports/output/broadcaster/**' - 'nexosim/src/ports/output/broadcaster/**'
- 'asynchronix/src/ports/source/broadcaster.rs' - 'nexosim/src/ports/source/broadcaster.rs'
- 'asynchronix/src/ports/source/broadcaster/**' - 'nexosim/src/ports/source/broadcaster/**'
- 'asynchronix/src/util/cached_rw_lock.rs' - 'nexosim/src/util/cached_rw_lock.rs'
- 'asynchronix/src/util/slot.rs' - 'nexosim/src/util/slot.rs'
- 'asynchronix/src/util/sync_cell.rs' - 'nexosim/src/util/sync_cell.rs'
push: push:
branches: [ main ] branches: [ main ]
paths: paths:
- 'asynchronix/src/channel.rs' - 'nexosim/src/channel.rs'
- 'asynchronix/src/channel/**' - 'nexosim/src/channel/**'
- 'asynchronix/src/executor/task.rs' - 'nexosim/src/executor/task.rs'
- 'asynchronix/src/executor/task/**' - 'nexosim/src/executor/task/**'
- 'asynchronix/src/loom_exports.rs' - 'nexosim/src/loom_exports.rs'
- 'asynchronix/src/ports/output/broadcaster.rs' - 'nexosim/src/ports/output/broadcaster.rs'
- 'asynchronix/src/ports/output/broadcaster/**' - 'nexosim/src/ports/output/broadcaster/**'
- 'asynchronix/src/ports/source/broadcaster.rs' - 'nexosim/src/ports/source/broadcaster.rs'
- 'asynchronix/src/ports/source/broadcaster/**' - 'nexosim/src/ports/source/broadcaster/**'
- 'asynchronix/src/util/cached_rw_lock.rs' - 'nexosim/src/util/cached_rw_lock.rs'
- 'asynchronix/src/util/slot.rs' - 'nexosim/src/util/slot.rs'
- 'asynchronix/src/util/sync_cell.rs' - 'nexosim/src/util/sync_cell.rs'
jobs: jobs:
loom: loom:
@ -46,4 +46,4 @@ jobs:
- name: Run cargo test (Loom) - name: Run cargo test (Loom)
run: cargo test --lib --release run: cargo test --lib --release
env: env:
RUSTFLAGS: --cfg asynchronix_loom RUSTFLAGS: --cfg nexosim_loom

View File

@ -1,3 +1,3 @@
[workspace] [workspace]
members = ["asynchronix", "asynchronix-util"] members = ["nexosim", "nexosim-util"]
resolver = "2" resolver = "2"

View File

@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2024 Asynchronics sp. z o.o. and Asynchronix Contributors Copyright (c) 2024 Asynchronics sp. z o.o. and NeXosim Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,17 +1,18 @@
# Asynchronix # NeXosim
Asynchronix is a developer-friendly, highly optimized discrete-event simulation NeXosim (né Asynchronix) is a developer-friendly, highly optimized
framework written in Rust. It is meant to scale from small, simple simulations discrete-event simulation framework written in Rust. It is meant to scale from
to very large simulation benches with complex time-driven state machines. small, simple simulations to very large simulation benches with complex
time-driven state machines.
[![Cargo](https://img.shields.io/crates/v/asynchronix.svg)](https://crates.io/crates/asynchronix) [![Cargo](https://img.shields.io/crates/v/nexosim.svg)](https://crates.io/crates/nexosim)
[![Documentation](https://docs.rs/asynchronix/badge.svg)](https://docs.rs/asynchronix) [![Documentation](https://docs.rs/nexosim/badge.svg)](https://docs.rs/nexosim)
[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](https://github.com/asynchronics/asynchronix#license) [![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](https://github.com/asynchronics/nexosim#license)
## Overview ## Overview
Asynchronix is a simulator that leverages asynchronous programming to NeXosim is a simulator that leverages asynchronous programming to
transparently and efficiently auto-parallelize simulations by means of a custom transparently and efficiently auto-parallelize simulations by means of a custom
multi-threaded executor. multi-threaded executor.
@ -22,7 +23,7 @@ communicating with other models through message passing via connections defined
during bench assembly. during bench assembly.
Although the main impetus for its development was the need for simulators able Although the main impetus for its development was the need for simulators able
to handle large cyberphysical systems, Asynchronix is a general-purpose to handle large cyberphysical systems, NeXosim is a general-purpose
discrete-event simulator expected to be suitable for a wide range of simulation discrete-event simulator expected to be suitable for a wide range of simulation
activities. It draws from experience on spacecraft real-time simulators but activities. It draws from experience on spacecraft real-time simulators but
differs from existing tools in the space industry in a number of respects, differs from existing tools in the space industry in a number of respects,
@ -35,7 +36,7 @@ including:
2) *developer-friendliness*: an ergonomic API and Rust's support for algebraic 2) *developer-friendliness*: an ergonomic API and Rust's support for algebraic
types make it ideal for the "cyber" part in cyberphysical, i.e. for modelling types make it ideal for the "cyber" part in cyberphysical, i.e. for modelling
digital devices with even very complex state machines, digital devices with even very complex state machines,
3) *open-source*: last but not least, Asynchronix is distributed under the very 3) *open-source*: last but not least, NeXosim is distributed under the very
permissive MIT and Apache 2 licenses, with the explicit intent to foster an permissive MIT and Apache 2 licenses, with the explicit intent to foster an
ecosystem where models can be easily exchanged without reliance on ecosystem where models can be easily exchanged without reliance on
proprietary APIs. proprietary APIs.
@ -49,10 +50,10 @@ The [API] documentation is relatively exhaustive and includes a practical
overview which should provide all necessary information to get started. overview which should provide all necessary information to get started.
More fleshed out examples can also be found in the dedicated More fleshed out examples can also be found in the dedicated
[simulator](asynchronix/examples) and [utilities](asynchronix-util/examples) [simulator](nexosim/examples) and [utilities](nexosim-util/examples)
directories. directories.
[API]: https://docs.rs/asynchronix [API]: https://docs.rs/nexosim
## Usage ## Usage
@ -61,7 +62,7 @@ Add this to your `Cargo.toml`:
```toml ```toml
[dependencies] [dependencies]
asynchronix = "0.2.2" nexosim = "0.2.2"
``` ```
@ -76,9 +77,9 @@ asynchronix = "0.2.2"
// Input ●─────►│ multiplier 1 ├─────►│ multiplier 2 ├─────► Output // Input ●─────►│ multiplier 1 ├─────►│ multiplier 2 ├─────► Output
// │ │ │ │ // │ │ │ │
// └──────────────┘ └──────────────┘ // └──────────────┘ └──────────────┘
use asynchronix::model::{Model, Output}; use nexosim::model::{Model, Output};
use asynchronix::simulation::{Mailbox, SimInit}; use nexosim::simulation::{Mailbox, SimInit};
use asynchronix::time::{MonotonicTime, Scheduler}; use nexosim::time::{MonotonicTime, Scheduler};
use std::time::Duration; use std::time::Duration;
// A model that doubles its input and forwards it with a 1s delay. // A model that doubles its input and forwards it with a 1s delay.
@ -136,7 +137,7 @@ assert_eq!(output_slot.take(), Some(14.0));
# Implementation notes # Implementation notes
Under the hood, Asynchronix is based on an asynchronous implementation of the Under the hood, NeXosim is based on an asynchronous implementation of the
[actor model][actor_model], where each simulation model is an actor. The [actor model][actor_model], where each simulation model is an actor. The
messages actually exchanged between models are `async` closures which capture messages actually exchanged between models are `async` closures which capture
the event's or request's value and take the model as `&mut self` argument. The the event's or request's value and take the model as `&mut self` argument. The
@ -154,13 +155,13 @@ asynchronous runtimes such as [Tokio][tokio], because the end of a set of
computations is technically a deadlock: the computation completes when all model computations is technically a deadlock: the computation completes when all model
have nothing left to do and are blocked on an empty mailbox. Also, instead of have nothing left to do and are blocked on an empty mailbox. Also, instead of
managing a conventional reactor, the runtime manages a priority queue containing managing a conventional reactor, the runtime manages a priority queue containing
the posted events. For these reasons, Asynchronix relies on a fully custom the posted events. For these reasons, NeXosim relies on a fully custom
runtime. runtime.
Even though the runtime was largely influenced by Tokio, it features additional Even though the runtime was largely influenced by Tokio, it features additional
optimizations that make its faster than any other multi-threaded Rust executor optimizations that make its faster than any other multi-threaded Rust executor
on the typically message-passing-heavy workloads seen in discrete-event on the typically message-passing-heavy workloads seen in discrete-event
simulation (see [benchmark]). Asynchronix also improves over the state of the simulation (see [benchmark]). NeXosim also improves over the state of the
art with a very fast custom MPSC channel, which performance has been art with a very fast custom MPSC channel, which performance has been
demonstrated through [Tachyonix][tachyonix], a general-purpose offshoot of this demonstrated through [Tachyonix][tachyonix], a general-purpose offshoot of this
channel. channel.

View File

@ -1,7 +0,0 @@
[package]
name = "asynchronix-util"
version = "0.1.0"
edition = "2021"
[dependencies]
asynchronix = {version = "0.2.2", path = "../asynchronix"}

View File

@ -1,7 +0,0 @@
use super::*;
#[cfg(not(asynchronix_loom))]
mod general;
#[cfg(asynchronix_loom)]
mod loom;

7
nexosim-util/Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "nexosim-util"
version = "0.1.0"
edition = "2021"
[dependencies]
nexosim = {version = "0.2.2", path = "../nexosim"}

View File

@ -17,11 +17,11 @@
use std::time::Duration; use std::time::Duration;
use asynchronix::model::{Context, InitializedModel, Model}; use nexosim::model::{Context, InitializedModel, Model};
use asynchronix::ports::{EventBuffer, Output}; use nexosim::ports::{EventBuffer, Output};
use asynchronix::simulation::{AutoActionKey, Mailbox, SimInit, SimulationError}; use nexosim::simulation::{AutoActionKey, Mailbox, SimInit, SimulationError};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
use asynchronix_util::observables::{Observable, ObservableState, ObservableValue}; use nexosim_util::observables::{Observable, ObservableState, ObservableValue};
/// House keeping TM. /// House keeping TM.
#[derive(Clone, Copy, Debug, PartialEq)] #[derive(Clone, Copy, Debug, PartialEq)]

View File

@ -6,7 +6,7 @@
use std::ops::Deref; use std::ops::Deref;
use asynchronix::ports::Output; use nexosim::ports::Output;
/// Observability trait. /// Observability trait.
pub trait Observable<T> { pub trait Observable<T> {

View File

@ -1,5 +1,5 @@
[package] [package]
name = "asynchronix" name = "nexosim"
# When incrementing version and releasing to crates.io: # When incrementing version and releasing to crates.io:
# - Update crate version in this Cargo.toml # - Update crate version in this Cargo.toml
# - Update crate version in README.md # - Update crate version in README.md
@ -14,7 +14,7 @@ version = "0.2.2"
edition = "2021" edition = "2021"
rust-version = "1.77.0" rust-version = "1.77.0"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
repository = "https://github.com/asynchronics/asynchronix" repository = "https://github.com/asynchronics/nexosim"
readme = "../README.md" readme = "../README.md"
description = """ description = """
A high performance asychronous compute framework for system simulation. A high performance asychronous compute framework for system simulation.
@ -64,17 +64,17 @@ futures-util = "0.3"
futures-executor = "0.3" futures-executor = "0.3"
tracing-subscriber = { version= "0.3.18", features=["env-filter"] } tracing-subscriber = { version= "0.3.18", features=["env-filter"] }
[target.'cfg(asynchronix_loom)'.dev-dependencies] [target.'cfg(nexosim_loom)'.dev-dependencies]
loom = "0.7" loom = "0.7"
waker-fn = "1.1" waker-fn = "1.1"
[target.'cfg(asynchronix_grpc_codegen)'.build-dependencies] [target.'cfg(nexosim_grpc_codegen)'.build-dependencies]
tonic-build = { version = "0.12" } tonic-build = { version = "0.12" }
[lints.rust] [lints.rust]
# `asynchronix_loom` flag: run loom-based tests. # `nexosim_loom` flag: run loom-based tests.
# `asynchronix_grpc_codegen` flag: regenerate gRPC code from .proto definitions. # `nexosim_grpc_codegen` flag: regenerate gRPC code from .proto definitions.
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(asynchronix_loom)', 'cfg(asynchronix_grpc_codegen)'] } unexpected_cfgs = { level = "warn", check-cfg = ['cfg(nexosim_loom)', 'cfg(nexosim_grpc_codegen)'] }
[package.metadata.docs.rs] [package.metadata.docs.rs]
all-features = true all-features = true

View File

@ -1,5 +1,5 @@
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
#[cfg(asynchronix_grpc_codegen)] #[cfg(nexosim_grpc_codegen)]
tonic_build::configure() tonic_build::configure()
.build_client(false) .build_client(false)
.out_dir("src/grpc/codegen/") .out_dir("src/grpc/codegen/")

View File

@ -25,10 +25,10 @@
use std::time::Duration; use std::time::Duration;
use asynchronix::model::{BuildContext, Model, ProtoModel}; use nexosim::model::{BuildContext, Model, ProtoModel};
use asynchronix::ports::{EventBuffer, Output}; use nexosim::ports::{EventBuffer, Output};
use asynchronix::simulation::{Mailbox, SimInit, SimulationError}; use nexosim::simulation::{Mailbox, SimInit, SimulationError};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
mod stepper_motor; mod stepper_motor;

View File

@ -33,10 +33,10 @@
use std::time::Duration; use std::time::Duration;
use asynchronix::model::{Context, InitializedModel, Model}; use nexosim::model::{Context, InitializedModel, Model};
use asynchronix::ports::{EventSlot, Output}; use nexosim::ports::{EventSlot, Output};
use asynchronix::simulation::{ActionKey, Mailbox, SimInit, SimulationError}; use nexosim::simulation::{ActionKey, Mailbox, SimInit, SimulationError};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
/// Water pump. /// Water pump.
pub struct Pump { pub struct Pump {

View File

@ -24,10 +24,10 @@ use std::sync::{Arc, Condvar, Mutex};
use std::thread::{self, sleep, JoinHandle}; use std::thread::{self, sleep, JoinHandle};
use std::time::Duration; use std::time::Duration;
use asynchronix::model::{BuildContext, Context, InitializedModel, Model, ProtoModel}; use nexosim::model::{BuildContext, Context, InitializedModel, Model, ProtoModel};
use asynchronix::ports::{EventBuffer, Output}; use nexosim::ports::{EventBuffer, Output};
use asynchronix::simulation::{Mailbox, SimInit, SimulationError}; use nexosim::simulation::{Mailbox, SimInit, SimulationError};
use asynchronix::time::{AutoSystemClock, MonotonicTime}; use nexosim::time::{AutoSystemClock, MonotonicTime};
const DELTA: Duration = Duration::from_millis(2); const DELTA: Duration = Duration::from_millis(2);
const PERIOD: Duration = Duration::from_millis(20); const PERIOD: Duration = Duration::from_millis(20);

View File

@ -26,10 +26,10 @@
//! │ ├───────────────────────────────► Total power //! │ ├───────────────────────────────► Total power
//! └──────────┘ //! └──────────┘
//! ``` //! ```
use asynchronix::model::Model; use nexosim::model::Model;
use asynchronix::ports::{EventSlot, Output, Requestor}; use nexosim::ports::{EventSlot, Output, Requestor};
use asynchronix::simulation::{Mailbox, SimInit, SimulationError}; use nexosim::simulation::{Mailbox, SimInit, SimulationError};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
/// Power supply. /// Power supply.
pub struct PowerSupply { pub struct PowerSupply {

View File

@ -20,10 +20,10 @@
use std::future::Future; use std::future::Future;
use std::time::Duration; use std::time::Duration;
use asynchronix::model::{Context, InitializedModel, Model}; use nexosim::model::{Context, InitializedModel, Model};
use asynchronix::ports::{EventBuffer, Output}; use nexosim::ports::{EventBuffer, Output};
use asynchronix::simulation::{Mailbox, SimInit}; use nexosim::simulation::{Mailbox, SimInit};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
/// Stepper motor. /// Stepper motor.
pub struct Motor { pub struct Motor {
@ -179,7 +179,7 @@ impl Driver {
impl Model for Driver {} impl Model for Driver {}
#[allow(dead_code)] #[allow(dead_code)]
fn main() -> Result<(), asynchronix::simulation::SimulationError> { fn main() -> Result<(), nexosim::simulation::SimulationError> {
// --------------- // ---------------
// Bench assembly. // Bench assembly.
// --------------- // ---------------

View File

@ -413,7 +413,7 @@ impl<T: ?Sized> Producer<T> {
} }
/// Checks if the queue is closed. /// Checks if the queue is closed.
#[cfg(not(asynchronix_loom))] #[cfg(not(nexosim_loom))]
fn is_closed(&self) -> bool { fn is_closed(&self) -> bool {
self.inner.is_closed() self.inner.is_closed()
} }
@ -449,7 +449,7 @@ impl<T: ?Sized> Consumer<T> {
} }
/// Returns the number of items. /// Returns the number of items.
#[cfg(not(asynchronix_loom))] #[cfg(not(nexosim_loom))]
fn len(&self) -> usize { fn len(&self) -> usize {
self.inner.len() self.inner.len()
} }
@ -470,7 +470,7 @@ fn queue<T: ?Sized>(capacity: usize) -> (Producer<T>, Consumer<T>) {
} }
/// Regular tests. /// Regular tests.
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use super::*; use super::*;
@ -648,7 +648,7 @@ mod tests {
} }
/// Loom tests. /// Loom tests.
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -139,7 +139,7 @@ impl Signal {
} }
} }
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
use std::sync::Arc; use std::sync::Arc;

View File

@ -0,0 +1,7 @@
use super::*;
#[cfg(not(nexosim_loom))]
mod general;
#[cfg(nexosim_loom)]
mod loom;

View File

@ -1,9 +1,9 @@
//! A high-performance, discrete-event computation framework for system //! A high-performance, discrete-event computation framework for system
//! simulation. //! simulation.
//! //!
//! Asynchronix is a developer-friendly, yet highly optimized software simulator //! NeXosim (né Asynchronix) is a developer-friendly, yet highly optimized
//! able to scale to very large simulation with complex time-driven state //! software simulator able to scale to very large simulation with complex
//! machines. //! time-driven state machines.
//! //!
//! It promotes a component-oriented architecture that is familiar to system //! It promotes a component-oriented architecture that is familiar to system
//! engineers and closely resembles [flow-based programming][FBP]: a model is //! engineers and closely resembles [flow-based programming][FBP]: a model is
@ -12,10 +12,10 @@
//! defined during bench assembly. Unlike in conventional flow-based //! defined during bench assembly. Unlike in conventional flow-based
//! programming, request-reply patterns are also possible. //! programming, request-reply patterns are also possible.
//! //!
//! Asynchronix leverages asynchronous programming to perform //! NeXosim leverages asynchronous programming to perform auto-parallelization
//! auto-parallelization in a manner that is fully transparent to model authors //! in a manner that is fully transparent to model authors and users, achieving
//! and users, achieving high computational throughput on large simulation //! high computational throughput on large simulation benches by means of a
//! benches by means of a custom multi-threaded executor. //! custom multi-threaded executor.
//! //!
//! //!
//! [FBP]: https://en.wikipedia.org/wiki/Flow-based_programming //! [FBP]: https://en.wikipedia.org/wiki/Flow-based_programming
@ -83,8 +83,8 @@
//! `Multiplier` could be implemented as follows: //! `Multiplier` could be implemented as follows:
//! //!
//! ``` //! ```
//! use asynchronix::model::Model; //! use nexosim::model::Model;
//! use asynchronix::ports::Output; //! use nexosim::ports::Output;
//! //!
//! #[derive(Default)] //! #[derive(Default)]
//! pub struct Multiplier { //! pub struct Multiplier {
@ -110,8 +110,8 @@
//! //!
//! ``` //! ```
//! use std::time::Duration; //! use std::time::Duration;
//! use asynchronix::model::{Context, Model}; //! use nexosim::model::{Context, Model};
//! use asynchronix::ports::Output; //! use nexosim::ports::Output;
//! //!
//! #[derive(Default)] //! #[derive(Default)]
//! pub struct Delay { //! pub struct Delay {
@ -172,8 +172,8 @@
//! ``` //! ```
//! # mod models { //! # mod models {
//! # use std::time::Duration; //! # use std::time::Duration;
//! # use asynchronix::model::{Context, Model}; //! # use nexosim::model::{Context, Model};
//! # use asynchronix::ports::Output; //! # use nexosim::ports::Output;
//! # #[derive(Default)] //! # #[derive(Default)]
//! # pub struct Multiplier { //! # pub struct Multiplier {
//! # pub output: Output<f64>, //! # pub output: Output<f64>,
@ -199,9 +199,9 @@
//! # impl Model for Delay {} //! # impl Model for Delay {}
//! # } //! # }
//! use std::time::Duration; //! use std::time::Duration;
//! use asynchronix::ports::EventSlot; //! use nexosim::ports::EventSlot;
//! use asynchronix::simulation::{Mailbox, SimInit}; //! use nexosim::simulation::{Mailbox, SimInit};
//! use asynchronix::time::MonotonicTime; //! use nexosim::time::MonotonicTime;
//! //!
//! use models::{Delay, Multiplier}; //! use models::{Delay, Multiplier};
//! //!
@ -237,7 +237,7 @@
//! .add_model(delay2, delay2_mbox, "delay2") //! .add_model(delay2, delay2_mbox, "delay2")
//! .init(t0)?; //! .init(t0)?;
//! //!
//! # Ok::<(), asynchronix::simulation::SimulationError>(()) //! # Ok::<(), nexosim::simulation::SimulationError>(())
//! ``` //! ```
//! //!
//! ## Running simulations //! ## Running simulations
@ -273,8 +273,8 @@
//! ``` //! ```
//! # mod models { //! # mod models {
//! # use std::time::Duration; //! # use std::time::Duration;
//! # use asynchronix::model::{Context, Model}; //! # use nexosim::model::{Context, Model};
//! # use asynchronix::ports::Output; //! # use nexosim::ports::Output;
//! # #[derive(Default)] //! # #[derive(Default)]
//! # pub struct Multiplier { //! # pub struct Multiplier {
//! # pub output: Output<f64>, //! # pub output: Output<f64>,
@ -300,9 +300,9 @@
//! # impl Model for Delay {} //! # impl Model for Delay {}
//! # } //! # }
//! # use std::time::Duration; //! # use std::time::Duration;
//! # use asynchronix::ports::EventSlot; //! # use nexosim::ports::EventSlot;
//! # use asynchronix::simulation::{Mailbox, SimInit}; //! # use nexosim::simulation::{Mailbox, SimInit};
//! # use asynchronix::time::MonotonicTime; //! # use nexosim::time::MonotonicTime;
//! # use models::{Delay, Multiplier}; //! # use models::{Delay, Multiplier};
//! # let mut multiplier1 = Multiplier::default(); //! # let mut multiplier1 = Multiplier::default();
//! # let mut multiplier2 = Multiplier::default(); //! # let mut multiplier2 = Multiplier::default();
@ -344,23 +344,23 @@
//! assert_eq!(simu.time(), t0 + Duration::from_secs(2)); //! assert_eq!(simu.time(), t0 + Duration::from_secs(2));
//! assert_eq!(output_slot.next(), Some(42.0)); //! assert_eq!(output_slot.next(), Some(42.0));
//! //!
//! # Ok::<(), asynchronix::simulation::SimulationError>(()) //! # Ok::<(), nexosim::simulation::SimulationError>(())
//! ``` //! ```
//! //!
//! # Message ordering guarantees //! # Message ordering guarantees
//! //!
//! The Asynchronix runtime is based on the [actor model][actor_model], meaning //! The NeXosim runtime is based on the [actor model][actor_model], meaning that
//! that every simulation model can be thought of as an isolated entity running //! every simulation model can be thought of as an isolated entity running in
//! in its own thread. While in practice the runtime will actually multiplex and //! its own thread. While in practice the runtime will actually multiplex and
//! migrate models over a fixed set of kernel threads, models will indeed run in //! migrate models over a fixed set of kernel threads, models will indeed run in
//! parallel whenever possible. //! parallel whenever possible.
//! //!
//! Since Asynchronix is a time-based simulator, the runtime will always execute //! Since NeXosim is a time-based simulator, the runtime will always execute
//! tasks in chronological order, thus eliminating most ordering ambiguities //! tasks in chronological order, thus eliminating most ordering ambiguities
//! that could result from parallel execution. Nevertheless, it is sometimes //! that could result from parallel execution. Nevertheless, it is sometimes
//! possible for events and queries generated in the same time slice to lead to //! possible for events and queries generated in the same time slice to lead to
//! ambiguous execution orders. In order to make it easier to reason about such //! ambiguous execution orders. In order to make it easier to reason about such
//! situations, Asynchronix provides a set of guarantees about message delivery //! situations, NeXosim provides a set of guarantees about message delivery
//! order. Borrowing from the [Pony][pony] programming language, we refer to //! order. Borrowing from the [Pony][pony] programming language, we refer to
//! this contract as *causal messaging*, a property that can be summarized by //! this contract as *causal messaging*, a property that can be summarized by
//! these two rules: //! these two rules:
@ -394,7 +394,7 @@
//! //!
//! ```toml //! ```toml
//! [dependencies] //! [dependencies]
//! asynchronix = { version = "0.3", features = ["tracing"] } //! nexosim = { version = "0.3", features = ["tracing"] }
//! ``` //! ```
//! //!
//! See the [`tracing`] module for more information. //! See the [`tracing`] module for more information.
@ -409,7 +409,7 @@
//! framework. //! framework.
//! //!
//! [gh_examples]: //! [gh_examples]:
//! https://github.com/asynchronics/asynchronix/tree/main/asynchronix/examples //! https://github.com/asynchronics/nexosim/tree/main/nexosim/examples
//! //!
//! ## Modules documentation //! ## Modules documentation
//! //!

View File

@ -1,4 +1,4 @@
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
#[allow(unused_imports)] #[allow(unused_imports)]
pub(crate) mod sync { pub(crate) mod sync {
pub(crate) use loom::sync::{Arc, LockResult, Mutex, MutexGuard}; pub(crate) use loom::sync::{Arc, LockResult, Mutex, MutexGuard};
@ -10,7 +10,7 @@ pub(crate) mod sync {
}; };
} }
} }
#[cfg(not(all(test, asynchronix_loom)))] #[cfg(not(all(test, nexosim_loom)))]
#[allow(unused_imports)] #[allow(unused_imports)]
pub(crate) mod sync { pub(crate) mod sync {
pub(crate) use std::sync::{Arc, LockResult, Mutex, MutexGuard, PoisonError}; pub(crate) use std::sync::{Arc, LockResult, Mutex, MutexGuard, PoisonError};
@ -22,11 +22,11 @@ pub(crate) mod sync {
} }
} }
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
pub(crate) mod cell { pub(crate) mod cell {
pub(crate) use loom::cell::UnsafeCell; pub(crate) use loom::cell::UnsafeCell;
} }
#[cfg(not(all(test, asynchronix_loom)))] #[cfg(not(all(test, nexosim_loom)))]
pub(crate) mod cell { pub(crate) mod cell {
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct UnsafeCell<T>(std::cell::UnsafeCell<T>); pub(crate) struct UnsafeCell<T>(std::cell::UnsafeCell<T>);
@ -50,11 +50,11 @@ pub(crate) mod cell {
#[allow(unused_macros)] #[allow(unused_macros)]
macro_rules! debug_or_loom_assert { macro_rules! debug_or_loom_assert {
($($arg:tt)*) => (if cfg!(any(debug_assertions, asynchronix_loom)) { assert!($($arg)*); }) ($($arg:tt)*) => (if cfg!(any(debug_assertions, nexosim_loom)) { assert!($($arg)*); })
} }
#[allow(unused_macros)] #[allow(unused_macros)]
macro_rules! debug_or_loom_assert_eq { macro_rules! debug_or_loom_assert_eq {
($($arg:tt)*) => (if cfg!(any(debug_assertions, asynchronix_loom)) { assert_eq!($($arg)*); }) ($($arg:tt)*) => (if cfg!(any(debug_assertions, nexosim_loom)) { assert_eq!($($arg)*); })
} }
#[allow(unused_imports)] #[allow(unused_imports)]
pub(crate) use debug_or_loom_assert; pub(crate) use debug_or_loom_assert;

View File

@ -123,7 +123,7 @@ impl<T> ScopedLocalKey<T> {
} }
} }
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use std::cell::Cell; use std::cell::Cell;
use std::sync::mpsc::{channel, Sender}; use std::sync::mpsc::{channel, Sender};

View File

@ -36,7 +36,7 @@
//! default implementation of the [`Model`] trait: //! default implementation of the [`Model`] trait:
//! //!
//! ``` //! ```
//! use asynchronix::model::Model; //! use nexosim::model::Model;
//! //!
//! pub struct MyModel { //! pub struct MyModel {
//! // ... //! // ...
@ -48,7 +48,7 @@
//! methods can be explicitly implemented: //! methods can be explicitly implemented:
//! //!
//! ``` //! ```
//! use asynchronix::model::{Context, InitializedModel, Model}; //! use nexosim::model::{Context, InitializedModel, Model};
//! //!
//! pub struct MyModel { //! pub struct MyModel {
//! // ... //! // ...
@ -69,8 +69,8 @@
//! explicitly implemented: //! explicitly implemented:
//! //!
//! ``` //! ```
//! use asynchronix::model::{BuildContext, InitializedModel, Model, ProtoModel}; //! use nexosim::model::{BuildContext, InitializedModel, Model, ProtoModel};
//! use asynchronix::ports::Output; //! use nexosim::ports::Output;
//! //!
//! /// The final model. //! /// The final model.
//! pub struct Multiplier { //! pub struct Multiplier {
@ -146,8 +146,8 @@
//! #### Example //! #### Example
//! //!
//! ``` //! ```
//! use asynchronix::model::Model; //! use nexosim::model::Model;
//! use asynchronix::ports::{Output, Requestor}; //! use nexosim::ports::{Output, Requestor};
//! //!
//! pub struct MyModel { //! pub struct MyModel {
//! pub my_output: Output<String>, //! pub my_output: Output<String>,
@ -213,7 +213,7 @@
//! #### Example //! #### Example
//! //!
//! ``` //! ```
//! use asynchronix::model::{Context, Model}; //! use nexosim::model::{Context, Model};
//! //!
//! pub struct MyModel { //! pub struct MyModel {
//! // ... //! // ...
@ -264,7 +264,7 @@ pub trait Model: Sized + Send + 'static {
/// use std::future::Future; /// use std::future::Future;
/// use std::pin::Pin; /// use std::pin::Pin;
/// ///
/// use asynchronix::model::{Context, InitializedModel, Model}; /// use nexosim::model::{Context, InitializedModel, Model};
/// ///
/// pub struct MyModel { /// pub struct MyModel {
/// // ... /// // ...

View File

@ -42,8 +42,8 @@ use super::{Model, ProtoModel};
/// ///
/// ``` /// ```
/// use std::time::Duration; /// use std::time::Duration;
/// use asynchronix::model::{Context, Model}; /// use nexosim::model::{Context, Model};
/// use asynchronix::ports::Output; /// use nexosim::ports::Output;
/// ///
/// #[derive(Default)] /// #[derive(Default)]
/// pub struct DelayedGreeter { /// pub struct DelayedGreeter {
@ -120,7 +120,7 @@ impl<M: Model> Context<M> {
/// ``` /// ```
/// use std::time::Duration; /// use std::time::Duration;
/// ///
/// use asynchronix::model::{Context, Model}; /// use nexosim::model::{Context, Model};
/// ///
/// // A timer. /// // A timer.
/// pub struct Timer {} /// pub struct Timer {}
@ -165,9 +165,9 @@ impl<M: Model> Context<M> {
/// # Examples /// # Examples
/// ///
/// ``` /// ```
/// use asynchronix::model::{Context, Model}; /// use nexosim::model::{Context, Model};
/// use asynchronix::simulation::ActionKey; /// use nexosim::simulation::ActionKey;
/// use asynchronix::time::MonotonicTime; /// use nexosim::time::MonotonicTime;
/// ///
/// // An alarm clock that can be cancelled. /// // An alarm clock that can be cancelled.
/// #[derive(Default)] /// #[derive(Default)]
@ -230,8 +230,8 @@ impl<M: Model> Context<M> {
/// ``` /// ```
/// use std::time::Duration; /// use std::time::Duration;
/// ///
/// use asynchronix::model::{Context, Model}; /// use nexosim::model::{Context, Model};
/// use asynchronix::time::MonotonicTime; /// use nexosim::time::MonotonicTime;
/// ///
/// // An alarm clock beeping at 1Hz. /// // An alarm clock beeping at 1Hz.
/// pub struct BeepingAlarmClock {} /// pub struct BeepingAlarmClock {}
@ -290,9 +290,9 @@ impl<M: Model> Context<M> {
/// ``` /// ```
/// use std::time::Duration; /// use std::time::Duration;
/// ///
/// use asynchronix::model::{Context, Model}; /// use nexosim::model::{Context, Model};
/// use asynchronix::simulation::ActionKey; /// use nexosim::simulation::ActionKey;
/// use asynchronix::time::MonotonicTime; /// use nexosim::time::MonotonicTime;
/// ///
/// // An alarm clock beeping at 1Hz that can be cancelled before it sets off, or /// // An alarm clock beeping at 1Hz that can be cancelled before it sets off, or
/// // stopped after it sets off. /// // stopped after it sets off.
@ -389,9 +389,9 @@ impl<M: Model> fmt::Debug for Context<M> {
/// ///
/// ``` /// ```
/// use std::time::Duration; /// use std::time::Duration;
/// use asynchronix::model::{BuildContext, Model, ProtoModel}; /// use nexosim::model::{BuildContext, Model, ProtoModel};
/// use asynchronix::ports::Output; /// use nexosim::ports::Output;
/// use asynchronix::simulation::Mailbox; /// use nexosim::simulation::Mailbox;
/// ///
/// #[derive(Default)] /// #[derive(Default)]
/// struct MultiplyBy2 { /// struct MultiplyBy2 {

View File

@ -27,12 +27,12 @@
//! assemblies, see the [`assembly example`][assembly]. //! assemblies, see the [`assembly example`][assembly].
//! //!
//! [assembly]: //! [assembly]:
//! https://github.com/asynchronics/asynchronix/tree/main/asynchronix/examples/assembly.rs //! https://github.com/asynchronics/nexosim/tree/main/nexosim/examples/assembly.rs
//! //!
//! ``` //! ```
//! use asynchronix::model::{BuildContext, Model, ProtoModel}; //! use nexosim::model::{BuildContext, Model, ProtoModel};
//! use asynchronix::ports::Output; //! use nexosim::ports::Output;
//! use asynchronix::simulation::Mailbox; //! use nexosim::simulation::Mailbox;
//! //!
//! pub struct ChildModel { //! pub struct ChildModel {
//! pub output: Output<u64>, //! pub output: Output<u64>,

View File

@ -504,7 +504,7 @@ fn recycle_vec<T, U>(mut v: Vec<T>) -> Vec<U> {
v_out v_out
} }
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@ -834,7 +834,7 @@ mod tests {
} }
} }
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
mod tests { mod tests {
use futures_channel::mpsc; use futures_channel::mpsc;
use futures_util::StreamExt; use futures_util::StreamExt;

View File

@ -408,7 +408,7 @@ impl<R> Iterator for ReplyIterator<R> {
} }
} }
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@ -738,7 +738,7 @@ mod tests {
} }
} }
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
mod tests { mod tests {
use futures_channel::mpsc; use futures_channel::mpsc;
use futures_util::StreamExt; use futures_util::StreamExt;

View File

@ -47,10 +47,10 @@
//! //!
//! ## Avoiding deadlocks //! ## Avoiding deadlocks
//! //!
//! While the underlying architecture of Asynchronix—the actor model—should //! While the underlying architecture of NeXosim—the actor model—should prevent
//! prevent most race conditions (including obviously data races which are not //! most race conditions (including obviously data races which are not possible
//! possible in safe Rust) it is still possible in theory to generate deadlocks. //! in safe Rust) it is still possible in theory to generate deadlocks. Though
//! Though rare in practice, these may occur due to one of the below: //! rare in practice, these may occur due to one of the below:
//! //!
//! 1. *query loopback*: if a model sends a query which loops back to itself //! 1. *query loopback*: if a model sends a query which loops back to itself
//! (either directly or transitively via other models), that model //! (either directly or transitively via other models), that model

View File

@ -36,8 +36,8 @@ impl Scheduler {
/// # Examples /// # Examples
/// ///
/// ``` /// ```
/// use asynchronix::simulation::Scheduler; /// use nexosim::simulation::Scheduler;
/// use asynchronix::time::MonotonicTime; /// use nexosim::time::MonotonicTime;
/// ///
/// fn is_third_millenium(scheduler: &Scheduler) -> bool { /// fn is_third_millenium(scheduler: &Scheduler) -> bool {
/// let time = scheduler.time(); /// let time = scheduler.time();

View File

@ -15,8 +15,8 @@
//! the specified timestamp. //! the specified timestamp.
//! //!
//! ``` //! ```
//! use asynchronix::model::{Context, Model}; //! use nexosim::model::{Context, Model};
//! use asynchronix::time::MonotonicTime; //! use nexosim::time::MonotonicTime;
//! //!
//! // An alarm clock model. //! // An alarm clock model.
//! pub struct AlarmClock { //! pub struct AlarmClock {

View File

@ -66,8 +66,8 @@ impl SystemClock {
/// ``` /// ```
/// use std::time::{Duration, Instant}; /// use std::time::{Duration, Instant};
/// ///
/// use asynchronix::simulation::SimInit; /// use nexosim::simulation::SimInit;
/// use asynchronix::time::{MonotonicTime, SystemClock}; /// use nexosim::time::{MonotonicTime, SystemClock};
/// ///
/// let t0 = MonotonicTime::new(1_234_567_890, 0).unwrap(); /// let t0 = MonotonicTime::new(1_234_567_890, 0).unwrap();
/// ///
@ -107,8 +107,8 @@ impl SystemClock {
/// ``` /// ```
/// use std::time::{Duration, UNIX_EPOCH}; /// use std::time::{Duration, UNIX_EPOCH};
/// ///
/// use asynchronix::simulation::SimInit; /// use nexosim::simulation::SimInit;
/// use asynchronix::time::{MonotonicTime, SystemClock}; /// use nexosim::time::{MonotonicTime, SystemClock};
/// ///
/// let t0 = MonotonicTime::new(1_234_567_890, 0).unwrap(); /// let t0 = MonotonicTime::new(1_234_567_890, 0).unwrap();
/// ///

View File

@ -6,7 +6,7 @@
//! by a model is wrapped in a [`tracing::Span`] with the following metadata: //! by a model is wrapped in a [`tracing::Span`] with the following metadata:
//! //!
//! - name: `model`, //! - name: `model`,
//! - target: `asynchronix`, //! - target: `nexosim`,
//! - verbosity level: [`Level::INFO`](tracing::Level::INFO), //! - verbosity level: [`Level::INFO`](tracing::Level::INFO),
//! - a unique field called `name`, associated to the model name provided in //! - a unique field called `name`, associated to the model name provided in
//! [`SimInit::add_model`](crate::simulation::SimInit::add_model). //! [`SimInit::add_model`](crate::simulation::SimInit::add_model).
@ -53,7 +53,7 @@
//! configured: //! configured:
//! //!
//! ``` //! ```
//! use asynchronix::tracing::SimulationTime; //! use nexosim::tracing::SimulationTime;
//! //!
//! tracing_subscriber::fmt() //! tracing_subscriber::fmt()
//! .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) //! .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
@ -105,8 +105,8 @@
//! ``` //! ```
//! //!
//! If the `model` span name collides with that of spans defined outside //! If the `model` span name collides with that of spans defined outside
//! `asynchronix`, the above filters can be made more specific using //! `nexosim`, the above filters can be made more specific using
//! `asynchronix[model]` instead of just `[model]`. //! `nexosim[model]` instead of just `[model]`.
//! //!
//! //!
//! # Customization //! # Customization

View File

@ -121,7 +121,7 @@ const fn sum_masks() -> [usize; usize::BITS.trailing_zeros() as usize] {
m m
} }
#[cfg(all(test, not(asynchronix_loom), not(miri)))] #[cfg(all(test, not(nexosim_loom), not(miri)))]
mod tests { mod tests {
use super::*; use super::*;
use crate::util::rng; use crate::util::rng;

View File

@ -119,7 +119,7 @@ impl<T: Clone> DerefMut for CachedRwLockWriteGuard<'_, T> {
} }
} }
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -423,7 +423,7 @@ struct UniqueKey<K: Copy + Clone> {
epoch: u64, epoch: u64,
} }
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use std::fmt::Debug; use std::fmt::Debug;

View File

@ -109,7 +109,7 @@ impl<K: Copy + Ord, V> PriorityQueue<K, V> {
} }
} }
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use super::PriorityQueue; use super::PriorityQueue;

View File

@ -36,7 +36,7 @@ impl Rng {
} }
} }
#[cfg(all(test, not(asynchronix_loom), not(miri)))] #[cfg(all(test, not(nexosim_loom), not(miri)))]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -321,7 +321,7 @@ pub(crate) fn slot<T>() -> (SlotWriter<T>, SlotReader<T>) {
(writer, reader) (writer, reader)
} }
#[cfg(all(test, not(asynchronix_loom)))] #[cfg(all(test, not(nexosim_loom)))]
mod tests { mod tests {
use super::*; use super::*;
@ -386,7 +386,7 @@ mod tests {
} }
} }
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -208,7 +208,7 @@ impl<T: TearableAtomic> Clone for SyncCellReader<T> {
pub(crate) struct SyncCellReadError {} pub(crate) struct SyncCellReadError {}
/// Loom tests. /// Loom tests.
#[cfg(all(test, asynchronix_loom))] #[cfg(all(test, nexosim_loom))]
mod tests { mod tests {
use super::*; use super::*;

View File

@ -2,10 +2,10 @@
use std::time::Duration; use std::time::Duration;
use asynchronix::model::{Context, Model}; use nexosim::model::{Context, Model};
use asynchronix::ports::{EventBuffer, Output}; use nexosim::ports::{EventBuffer, Output};
use asynchronix::simulation::{ActionKey, Mailbox, SimInit}; use nexosim::simulation::{ActionKey, Mailbox, SimInit};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
const MT_NUM_THREADS: usize = 4; const MT_NUM_THREADS: usize = 4;

View File

@ -3,9 +3,9 @@
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
use asynchronix::model::Model; use nexosim::model::Model;
use asynchronix::simulation::{ExecutionError, Mailbox, SimInit}; use nexosim::simulation::{ExecutionError, Mailbox, SimInit};
use asynchronix::time::{AutoSystemClock, MonotonicTime}; use nexosim::time::{AutoSystemClock, MonotonicTime};
const MT_NUM_THREADS: usize = 4; const MT_NUM_THREADS: usize = 4;

View File

@ -1,9 +1,9 @@
//! Deadlock-detection for model loops. //! Deadlock-detection for model loops.
use asynchronix::model::Model; use nexosim::model::Model;
use asynchronix::ports::{Output, Requestor}; use nexosim::ports::{Output, Requestor};
use asynchronix::simulation::{DeadlockInfo, ExecutionError, Mailbox, SimInit}; use nexosim::simulation::{DeadlockInfo, ExecutionError, Mailbox, SimInit};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
const MT_NUM_THREADS: usize = 4; const MT_NUM_THREADS: usize = 4;

View File

@ -1,9 +1,9 @@
//! Model panic reporting. //! Model panic reporting.
use asynchronix::model::Model; use nexosim::model::Model;
use asynchronix::ports::Output; use nexosim::ports::Output;
use asynchronix::simulation::{ExecutionError, Mailbox, SimInit}; use nexosim::simulation::{ExecutionError, Mailbox, SimInit};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
const MT_NUM_THREADS: usize = 4; const MT_NUM_THREADS: usize = 4;

View File

@ -3,11 +3,11 @@
use std::time::Duration; use std::time::Duration;
#[cfg(not(miri))] #[cfg(not(miri))]
use asynchronix::model::Context; use nexosim::model::Context;
use asynchronix::model::Model; use nexosim::model::Model;
use asynchronix::ports::{EventBuffer, Output}; use nexosim::ports::{EventBuffer, Output};
use asynchronix::simulation::{Address, Mailbox, Scheduler, SimInit, Simulation}; use nexosim::simulation::{Address, Mailbox, Scheduler, SimInit, Simulation};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
const MT_NUM_THREADS: usize = 4; const MT_NUM_THREADS: usize = 4;
@ -259,7 +259,7 @@ fn schedule_periodic_keyed_events_mt() {
use std::time::{Instant, SystemTime}; use std::time::{Instant, SystemTime};
#[cfg(not(miri))] #[cfg(not(miri))]
use asynchronix::time::{AutoSystemClock, Clock, SystemClock}; use nexosim::time::{AutoSystemClock, Clock, SystemClock};
// Model that outputs timestamps at init and each time its input is triggered. // Model that outputs timestamps at init and each time its input is triggered.
#[cfg(not(miri))] #[cfg(not(miri))]
@ -275,7 +275,7 @@ impl TimestampModel {
} }
#[cfg(not(miri))] #[cfg(not(miri))]
impl Model for TimestampModel { impl Model for TimestampModel {
async fn init(mut self, _: &mut Context<Self>) -> asynchronix::model::InitializedModel<Self> { async fn init(mut self, _: &mut Context<Self>) -> nexosim::model::InitializedModel<Self> {
self.stamp.send((Instant::now(), SystemTime::now())).await; self.stamp.send((Instant::now(), SystemTime::now())).await;
self.into() self.into()
} }

View File

@ -5,10 +5,10 @@ use std::sync::Arc;
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
use asynchronix::model::Model; use nexosim::model::Model;
use asynchronix::ports::Output; use nexosim::ports::Output;
use asynchronix::simulation::{ExecutionError, Mailbox, SimInit}; use nexosim::simulation::{ExecutionError, Mailbox, SimInit};
use asynchronix::time::MonotonicTime; use nexosim::time::MonotonicTime;
const MT_NUM_THREADS: usize = 4; const MT_NUM_THREADS: usize = 4;