use crate::{AnnIR, Annotation, Dialect, IR, OpMap, visualization::svg::Svg};
use std::path::Path;
mod composition;
mod hierarchy;
mod html;
mod layer_map;
mod layoutlang;
mod placement;
mod svg;
mod visual_annotation;
pub use composition::*;
pub use hierarchy::*;
pub use layer_map::*;
pub use layoutlang::*;
pub use visual_annotation::*;
#[cfg(test)]
mod test;
fn draw_ir<D: Dialect>(ir: &IR<D>, hierarchy_ann: Option<OpMap<Hierarchy>>) -> Svg {
let hierarchy_ann = hierarchy_ann.unwrap_or(ir.filled_opmap(Hierarchy::new()));
let ann_ir = AnnIR::new(ir, hierarchy_ann, ir.filled_valmap(()));
let layout_ir = generate_layout_ir(&ann_ir);
let placed_ir = placement::place(&layout_ir);
let scene = composition::compose(&placed_ir);
svg::draw(&scene)
}
fn draw_ann_ir<D: Dialect, OpAnn: Annotation + VisualAnnotation, ValAnn: Annotation>(
ir: &AnnIR<D, OpAnn, ValAnn>,
hierarchy_ann: Option<OpMap<Hierarchy>>,
) -> Svg {
let hierarchy_ann = hierarchy_ann.unwrap_or(ir.filled_opmap(Hierarchy::new()));
let ann_ir = AnnIR::new(ir, hierarchy_ann, ir.filled_valmap(()));
let mut layout_ir = generate_layout_ir(&ann_ir);
annotate_layout(&mut layout_ir, ir.op_annotations());
let placed_ir = placement::place(&layout_ir);
let scene = composition::compose(&placed_ir);
svg::draw(&scene)
}
pub fn draw_ir_to_svg<D: Dialect>(
ir: &IR<D>,
hierarchy_ann: Option<OpMap<Hierarchy>>,
path: impl AsRef<Path>,
) {
let svg_output = draw_ir(ir, hierarchy_ann);
let svg_content = format!("{}", svg_output);
std::fs::write(path, svg_content).expect("Failed to write SVG file");
}
pub fn draw_ann_ir_to_svg<D: Dialect, OpAnn: Annotation + VisualAnnotation, ValAnn: Annotation>(
ir: &AnnIR<D, OpAnn, ValAnn>,
hierarchy_ann: Option<OpMap<Hierarchy>>,
path: impl AsRef<Path>,
) {
let svg_output = draw_ann_ir(ir, hierarchy_ann);
let svg_content = format!("{}", svg_output);
std::fs::write(path, svg_content).expect("Failed to write SVG file");
}
pub fn draw_ir_to_html<D: Dialect>(
ir: &IR<D>,
hierarchy_ann: Option<OpMap<Hierarchy>>,
path: impl AsRef<Path>,
) {
let svg_output = draw_ir(ir, hierarchy_ann);
let html_output = html::wrap_svg(svg_output);
let html_content = format!("{}", html_output);
std::fs::write(path, html_content).expect("Failed to write HTML file");
}
pub fn draw_ann_ir_to_html<D: Dialect, OpAnn: Annotation + VisualAnnotation, ValAnn: Annotation>(
ir: &AnnIR<D, OpAnn, ValAnn>,
hierarchy_ann: Option<OpMap<Hierarchy>>,
path: impl AsRef<Path>,
) {
let svg_output = draw_ann_ir(ir, hierarchy_ann);
let html_output = html::wrap_svg(svg_output);
let html_content = format!("{}", html_output);
std::fs::write(path, html_content).expect("Failed to write HTML file");
}
impl<D: Dialect> IR<D> {
pub fn draw_to_html(&self, hierarchy_ann: Option<OpMap<Hierarchy>>, path: impl AsRef<Path>) {
draw_ir_to_html(self, hierarchy_ann, path);
}
}
impl<'ir, D: Dialect, OpAnn: Annotation + VisualAnnotation, ValAnn: Annotation>
AnnIR<'ir, D, OpAnn, ValAnn>
{
pub fn draw_to_html(&self, hierarchy_ann: Option<OpMap<Hierarchy>>, path: impl AsRef<Path>) {
draw_ann_ir_to_html(self, hierarchy_ann, path);
}
}