mirror of
https://gitlab.kit.edu/uskyk/kv.git
synced 2024-11-25 02:15:06 +00:00
DMF/KMF switch
This commit is contained in:
parent
6b4c6d9c22
commit
8dff087377
@ -16,4 +16,4 @@ itertools = "0.10.0"
|
|||||||
log = "0.4.14"
|
log = "0.4.14"
|
||||||
svg_fmt = { path = "../rust_debug/svg_fmt" }
|
svg_fmt = { path = "../rust_debug/svg_fmt" }
|
||||||
wasm-bindgen = "0.2.71"
|
wasm-bindgen = "0.2.71"
|
||||||
web-sys = { version = "0.3.48", features = ["Window", "Document", "Location", "HtmlCollection", "HtmlElement", "CssStyleDeclaration", "HtmlTextAreaElement", "HtmlInputElement"] }
|
web-sys = { version = "0.3.48", features = ["Window", "Document", "Location", "HtmlCollection", "HtmlElement", "HtmlSelectElement", "CssStyleDeclaration", "HtmlTextAreaElement", "HtmlInputElement"] }
|
||||||
|
@ -32,15 +32,19 @@
|
|||||||
<body>
|
<body>
|
||||||
<div id="main">
|
<div id="main">
|
||||||
<div id="settings">
|
<div id="settings">
|
||||||
<label>Number of variables: <input type="number" value="3" id="variables"></label><button id="apply-variables">Apply</button>
|
<label>Number of variables: <input type="number" min="1" value="3" id="variables"></label><button id="apply-variables">Apply</button>
|
||||||
</div>
|
</div>
|
||||||
<p id="hints">
|
<p id="hints">
|
||||||
Change cells by scrolling (up => 1, down => 0), typing (=> 1, 0) or deleting (=> -).
|
Change output specification by scrolling (up => 1, down => 0), typing (=> 1, 0) or deleting (=> -).
|
||||||
</p>
|
</p>
|
||||||
<p id="examples">
|
<p id="examples">
|
||||||
Load <a href="#--111100">example 1</a>, <a href="#-1111000-1-01---">example 2</a>, <a href="#11101111111111111111101111111101">example 3</a>.
|
Load <a href="#--111100">example 1</a>, <a href="#-1111000-1-01---">example 2</a>, <a href="#11101111111111111111101111111101">example 3</a>.
|
||||||
</p>
|
</p>
|
||||||
<div id="input-container"></div>
|
<div id="input-container"></div>
|
||||||
|
<div><label>Generate: <select id="mode-select">
|
||||||
|
<option value="dmf">DMF</option>
|
||||||
|
<option value="kmf">KMF</option>
|
||||||
|
</select></label></div>
|
||||||
<button id="calculate">Run</button>
|
<button id="calculate">Run</button>
|
||||||
<div id="output-help"></div>
|
<div id="output-help"></div>
|
||||||
<div id="output-container"></div>
|
<div id="output-container"></div>
|
||||||
|
@ -3,7 +3,7 @@ use wasm_bindgen::JsCast;
|
|||||||
use log::{Level, info};
|
use log::{Level, info};
|
||||||
|
|
||||||
use kv::*;
|
use kv::*;
|
||||||
use web_sys::{EventTarget, HtmlElement, HtmlInputElement, HtmlTextAreaElement};
|
use web_sys::{EventTarget, HtmlElement, HtmlInputElement, HtmlSelectElement, HtmlTextAreaElement};
|
||||||
|
|
||||||
macro_rules! web {
|
macro_rules! web {
|
||||||
($($x:ident)*) => {
|
($($x:ident)*) => {
|
||||||
@ -77,15 +77,16 @@ fn span(text: &str) -> HtmlElement {
|
|||||||
pub fn run() {
|
pub fn run() {
|
||||||
let document = web!(document);
|
let document = web!(document);
|
||||||
|
|
||||||
|
let mode = get_mode();
|
||||||
let var_count = get_var_number();
|
let var_count = get_var_number();
|
||||||
let vars = (0..var_count).map(|x| 2usize.pow(x as u32)).collect::<Vec<_>>();
|
let vars = (0..var_count).map(|x| 2usize.pow(x as u32)).collect::<Vec<_>>();
|
||||||
let function: FunctionSpec = (0..2usize.pow(var_count as u32)).map(|idx| get_input(idx)).collect();
|
let function: FunctionSpec = (0..2usize.pow(var_count as u32)).map(|idx| get_input(idx)).collect();
|
||||||
info!("function: {:?}", function);
|
info!("function: {:?}", function);
|
||||||
let hash = Some('#').into_iter().chain(function.iter().map::<char, _>(|&x| x.into())).collect::<String>();
|
let hash = Some('#').into_iter().chain(function.iter().map::<char, _>(|&x| x.into())).collect::<String>();
|
||||||
web2!(location).set_hash(&hash).unwrap();
|
web2!(location).set_hash(&hash).unwrap();
|
||||||
let groups = find_groups(&function, &vars, One);
|
let groups = find_groups(&function, &vars, mode);
|
||||||
let (prime, other) = find_core(&function, &vars, One, &groups);
|
let (prime, other) = find_core(&function, &vars, mode, &groups);
|
||||||
let solutions = real_solutions_idxed(function.clone(), &vars, One, &prime, &other);
|
let solutions = real_solutions_idxed(function.clone(), &vars, mode, &prime, &other);
|
||||||
|
|
||||||
let output_container = get_output_container();
|
let output_container = get_output_container();
|
||||||
if output_container.children().length() == 0 {
|
if output_container.children().length() == 0 {
|
||||||
@ -106,13 +107,7 @@ pub fn run() {
|
|||||||
let svg = svg_container.children().item(0).unwrap().unchecked_into::<HtmlElement>();
|
let svg = svg_container.children().item(0).unwrap().unchecked_into::<HtmlElement>();
|
||||||
svg.style().set_property("width", &format!("{}px", w * 80)).unwrap();
|
svg.style().set_property("width", &format!("{}px", w * 80)).unwrap();
|
||||||
svg.style().set_property("height", &format!("{}px", h * 80)).unwrap();
|
svg.style().set_property("height", &format!("{}px", h * 80)).unwrap();
|
||||||
let mut text = String::new();
|
let mut text = if mode == Output::One { print_df($sol) } else { print_mf($sol) };
|
||||||
for x in $sol {
|
|
||||||
if !text.is_empty() {
|
|
||||||
text += " ∨ ";
|
|
||||||
}
|
|
||||||
text += &print_implicant(x);
|
|
||||||
}
|
|
||||||
if text.is_empty() {
|
if text.is_empty() {
|
||||||
text += ".";
|
text += ".";
|
||||||
}
|
}
|
||||||
@ -124,13 +119,13 @@ pub fn run() {
|
|||||||
let mut block_masks: Vec<_> = prime.iter()
|
let mut block_masks: Vec<_> = prime.iter()
|
||||||
.map(block_to_mask)
|
.map(block_to_mask)
|
||||||
.collect();
|
.collect();
|
||||||
render_svg!(&prime, &block_masks);
|
render_svg!(prime.iter().map(|x| *x), &block_masks);
|
||||||
|
|
||||||
block_masks = prime.iter()
|
block_masks = prime.iter()
|
||||||
.map(block_to_mask)
|
.map(block_to_mask)
|
||||||
.chain(other.iter().map(block_to_mask)) // also display non-core
|
.chain(other.iter().map(block_to_mask)) // also display non-core
|
||||||
.collect();
|
.collect();
|
||||||
render_svg!(prime.iter().chain(other.iter()), &block_masks);
|
render_svg!(prime.iter().chain(other.iter()).map(|x| *x), &block_masks);
|
||||||
|
|
||||||
let mut size = usize::MAX;
|
let mut size = usize::MAX;
|
||||||
for sol in &solutions {
|
for sol in &solutions {
|
||||||
@ -148,8 +143,8 @@ pub fn run() {
|
|||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
.collect();
|
.collect();
|
||||||
let blocks = prime.iter()
|
let blocks = prime.iter().map(|x| *x)
|
||||||
.chain(sol.iter().map(|&i| &other[i]));
|
.chain(sol.iter().map(|&i| other[i]));
|
||||||
render_svg!(blocks, &block_masks);
|
render_svg!(blocks, &block_masks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +175,17 @@ fn get_var_number() -> usize {
|
|||||||
get_var_number_el().value().parse().unwrap()
|
get_var_number_el().value().parse().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_mode_el() -> HtmlSelectElement {
|
||||||
|
web!(document).get_element_by_id("mode-select").unwrap().unchecked_into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_mode() -> Output {
|
||||||
|
match &*get_mode_el().value() {
|
||||||
|
"kmf" => Output::Zero,
|
||||||
|
"dmf" | _ => Output::One,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn get_input_container() -> HtmlElement {
|
fn get_input_container() -> HtmlElement {
|
||||||
web!(document).get_element_by_id("input-container").unwrap().unchecked_into::<HtmlElement>()
|
web!(document).get_element_by_id("input-container").unwrap().unchecked_into::<HtmlElement>()
|
||||||
}
|
}
|
||||||
|
30
src/lib.rs
30
src/lib.rs
@ -289,6 +289,21 @@ pub fn block_to_mask<T: AsRef<[(Variable, Output)]>>(block: T) -> (Variable, Var
|
|||||||
pub fn check_mask(input: usize, mask: usize, inv_mask: usize) -> bool {
|
pub fn check_mask(input: usize, mask: usize, inv_mask: usize) -> bool {
|
||||||
input | mask == input && input & inv_mask == input
|
input | mask == input && input & inv_mask == input
|
||||||
}
|
}
|
||||||
|
pub fn print_mf<'a, I>(x: I) -> String
|
||||||
|
where I: IntoIterator<Item = &'a[(Variable, Output)]>
|
||||||
|
{
|
||||||
|
let mut text = String::new();
|
||||||
|
for x in x {
|
||||||
|
if !text.is_empty() {
|
||||||
|
text += ") ∧ (";
|
||||||
|
} else {
|
||||||
|
text.push('(');
|
||||||
|
}
|
||||||
|
text += &print_implicate(x);
|
||||||
|
}
|
||||||
|
text.push(')');
|
||||||
|
text
|
||||||
|
}
|
||||||
|
|
||||||
pub fn print_implicate(vars: &[(Variable, Output)]) -> String {
|
pub fn print_implicate(vars: &[(Variable, Output)]) -> String {
|
||||||
let mut s = String::new();
|
let mut s = String::new();
|
||||||
@ -299,12 +314,25 @@ pub fn print_implicate(vars: &[(Variable, Output)]) -> String {
|
|||||||
s += "̅";
|
s += "̅";
|
||||||
}
|
}
|
||||||
if i != vars.len() - 1 {
|
if i != vars.len() - 1 {
|
||||||
s += " v ";
|
s += " ∨ ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s
|
s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn print_df<'a, I>(x: I) -> String
|
||||||
|
where I: IntoIterator<Item = &'a[(Variable, Output)]>
|
||||||
|
{
|
||||||
|
let mut text = String::new();
|
||||||
|
for x in x {
|
||||||
|
if !text.is_empty() {
|
||||||
|
text += " ∨ ";
|
||||||
|
}
|
||||||
|
text += &print_implicant(x);
|
||||||
|
}
|
||||||
|
text
|
||||||
|
}
|
||||||
|
|
||||||
pub fn print_implicant(vars: &[(Variable, Output)]) -> String {
|
pub fn print_implicant(vars: &[(Variable, Output)]) -> String {
|
||||||
let mut s = String::new();
|
let mut s = String::new();
|
||||||
for i in 0..vars.len() {
|
for i in 0..vars.len() {
|
||||||
|
Loading…
Reference in New Issue
Block a user