Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add tracing #551

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,10 @@ path = "src/main.rs"
cast = "0.3"
clap = "2.33"
clap_conf = "0.1.5"
env_logger = "0.9"
inflections = "1.1"
log = { version = "~0.4", features = ["std"] }
tracing = { version = "0.1", default-features = false, features = ["std", "attributes"] }
tracing-subscriber = { version = "0.3", default-features = false, features = ["std", "ansi", "fmt", "env-filter", "tracing-log"] }

quote = "1.0"
proc-macro2 = "1.0"
anyhow = "1.0"
Expand Down
3 changes: 1 addition & 2 deletions src/generate/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ use crate::svd::Device;
use proc_macro2::{Ident, Span, TokenStream};
use quote::{quote, ToTokens};

use log::debug;
use std::fs::File;
use std::io::Write;
use tracing::debug;

use crate::util::{self, Config, ToSanitizedUpperCase};
use crate::Target;
Expand Down Expand Up @@ -194,7 +194,6 @@ pub fn render(d: &Device, config: &Config, device_x: &mut String) -> Result<Toke
continue;
}

debug!("Rendering peripheral {}", p.name);
match peripheral::render(p, &d.peripherals, &d.default_register_properties, config) {
Ok(periph) => out.extend(periph),
Err(e) => {
Expand Down
45 changes: 34 additions & 11 deletions src/generate/peripheral.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ use crate::svd::{
Cluster, ClusterInfo, DeriveFrom, DimElement, Peripheral, Register, RegisterCluster,
RegisterProperties,
};
use log::{debug, trace, warn};

use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
use quote::{quote, ToTokens};
use syn::{parse_str, Token};
use tracing::{debug, trace, warn};

use crate::util::{
self, handle_cluster_error, handle_reg_error, Config, FullName, ToSanitizedSnakeCase,
Expand All @@ -19,12 +20,15 @@ use anyhow::{anyhow, bail, Context, Result};

use crate::generate::register;

#[tracing::instrument(skip_all,fields(peripheral.name = %p_original.name))]
pub fn render(
p_original: &Peripheral,
all_peripherals: &[Peripheral],
defaults: &RegisterProperties,
config: &Config,
) -> Result<TokenStream> {
debug!("Rendering peripheral {}", p_original.name);

let mut out = TokenStream::new();

let p_derivedfrom = p_original
Expand Down Expand Up @@ -175,17 +179,24 @@ pub fn render(
let mut mod_items = TokenStream::new();
mod_items.extend(register_or_cluster_block(&ercs, &defaults, None, config)?);

debug!("Pushing cluster information into output");
if !clusters.is_empty() {
debug!("Pushing cluster information into output");
}
// Push all cluster related information into the peripheral module
for c in &clusters {
trace!("Cluster: {}", c.name);
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, config)?);
mod_items.extend(render_cluster_block(
c,
&defaults,
p,
all_peripherals,
config,
)?);
}
if !registers.is_empty() {
debug!("Pushing register information into output");
}

debug!("Pushing register information into output");
// Push all register related information into the peripheral module
for reg in registers {
trace!("Register: {}", reg.name);
match register::render(reg, registers, p, all_peripherals, &defaults, config) {
Ok(rendered_reg) => mod_items.extend(rendered_reg),
Err(e) => {
Expand Down Expand Up @@ -593,7 +604,6 @@ fn expand(
RegisterCluster::Register(register) => {
match expand_register(register, defs, name, config) {
Ok(expanded_reg) => {
trace!("Register: {}", register.name);
ercs_expanded.extend(expanded_reg);
}
Err(e) => {
Expand All @@ -605,7 +615,6 @@ fn expand(
RegisterCluster::Cluster(cluster) => {
match expand_cluster(cluster, defs, name, config) {
Ok(expanded_cluster) => {
trace!("Cluster: {}", cluster.name);
ercs_expanded.extend(expanded_cluster);
}
Err(e) => {
Expand Down Expand Up @@ -681,12 +690,15 @@ fn cluster_info_size_in_bits(
}

/// Render a given cluster (and any children) into `RegisterBlockField`s
#[tracing::instrument(skip_all, fields(cluster.name = %cluster.name, module = name))]
fn expand_cluster(
cluster: &Cluster,
defs: &RegisterProperties,
name: Option<&str>,
config: &Config,
) -> Result<Vec<RegisterBlockField>> {
trace!("Expanding cluster: {}", cluster.name);

let mut cluster_expanded = vec![];

let defs = cluster.default_register_properties.derive_from(defs);
Expand Down Expand Up @@ -743,12 +755,14 @@ fn expand_cluster(

/// If svd register arrays can't be converted to rust arrays (non sequential addresses, non
/// numeral indexes, or not containing all elements from 0 to size) they will be expanded
#[tracing::instrument(skip_all, fields(register.name = %register.name))]
fn expand_register(
register: &Register,
defs: &RegisterProperties,
name: Option<&str>,
config: &Config,
) -> Result<Vec<RegisterBlockField>> {
trace!("Expanding register: {}", register.name);
let mut register_expanded = vec![];

let register_size = register
Expand Down Expand Up @@ -805,13 +819,16 @@ fn expand_register(
}

/// Render a Cluster Block into `TokenStream`
fn cluster_block(
#[tracing::instrument(skip_all, fields(peripheral.name = %p.name, cluster.name = %c.name))]
fn render_cluster_block(
c: &Cluster,
defaults: &RegisterProperties,
p: &Peripheral,
all_peripherals: &[Peripheral],
config: &Config,
) -> Result<TokenStream> {
debug!("Rendering cluster: {}", c.name);

let mut mod_items = TokenStream::new();

// name_sc needs to take into account array type.
Expand Down Expand Up @@ -851,7 +868,13 @@ fn cluster_block(
// Generate the sub-cluster blocks.
let clusters = util::only_clusters(&c.children);
for c in &clusters {
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, config)?);
mod_items.extend(render_cluster_block(
c,
&defaults,
p,
all_peripherals,
config,
)?);
}

Ok(quote! {
Expand Down
4 changes: 3 additions & 1 deletion src/generate/register.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ use crate::svd::{
};
use cast::u64;
use core::u64;
use log::warn;
use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
use quote::{quote, ToTokens};
use tracing::{debug, warn};

use crate::util::{self, Config, ToSanitizedSnakeCase, ToSanitizedUpperCase, U32Ext};
use anyhow::{anyhow, Result};

#[tracing::instrument(skip_all, fields(register.name = %register.name))]
pub fn render(
register: &Register,
all_registers: &[&Register],
Expand All @@ -19,6 +20,7 @@ pub fn render(
defs: &RegisterProperties,
config: &Config,
) -> Result<TokenStream> {
debug!("Rendering register: {}", register.name);
let access = util::access_of(register);
let name = util::name_of(register, config.ignore_groups);
let span = Span::call_site();
Expand Down
45 changes: 20 additions & 25 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#![recursion_limit = "128"]

use log::{error, info};
use std::path::PathBuf;
use svd_parser::svd;
use tracing::{error, info};

mod generate;
mod util;
Expand Down Expand Up @@ -90,10 +90,9 @@ fn run() -> Result<()> {
.short("l")
.help(&format!(
"Choose which messages to log (overrides {})",
env_logger::DEFAULT_FILTER_ENV
tracing_subscriber::EnvFilter::DEFAULT_ENV
))
.takes_value(true)
.possible_values(&["off", "error", "warn", "info", "debug", "trace"]),
.takes_value(true),
)
.version(concat!(
env!("CARGO_PKG_VERSION"),
Expand Down Expand Up @@ -193,29 +192,25 @@ fn run() -> Result<()> {
}

fn setup_logging<'a>(getter: &'a impl clap_conf::Getter<'a, String>) {
// * Log at info by default.
// * Log at `info` by default.
// * Allow users the option of setting complex logging filters using
// env_logger's `RUST_LOG` environment variable.
// * Override both of those if the logging level is set via the `--log`
// command line argument.
let env = env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info");
let mut builder = env_logger::Builder::from_env(env);
builder.format_timestamp(None);

let log_lvl_from_env = std::env::var_os(env_logger::DEFAULT_FILTER_ENV).is_some();

if log_lvl_from_env {
log::set_max_level(log::LevelFilter::Trace);
} else {
let level = match getter.grab().arg("log_level").conf("log_level").done() {
Some(lvl) => lvl.parse().unwrap(),
None => log::LevelFilter::Info,
};
log::set_max_level(level);
builder.filter_level(level);
}
// the `RUST_LOG` environment variable.
// * Override both of those if the logging level is set via
// the `log_level` config setting.

let filter = match getter.grab().arg("log_level").conf("log_level").done() {
Some(lvl) => tracing_subscriber::EnvFilter::from(lvl),
None => tracing_subscriber::EnvFilter::from_default_env()
.add_directive(tracing::Level::INFO.into()),
};

builder.init();
tracing_subscriber::fmt()
.without_time()
.with_target(false)
.with_env_filter(filter)
.compact()
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

with compact
image

with full
image

I prefer compact, looks cleaner imo

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd want to remove the render:expand:etcetc things, but that would require a custom formatter, simple to do but maybe not neccessary, this shouldn't be used often

.with_ansi(true)
.init();
}

fn main() {
Expand Down