SpreadQuiz/class/Tasks/LogicTaskBase.php
2025-10-14 15:06:23 +02:00

107 lines
3.0 KiB
PHP

<?php
require_once "PicturedTask.php";
require_once "class/LogicFunction.php";
require_once "class/Utils.php";
require_once "class/LuaUtils.php";
class LogicTaskBase extends PicturedTask
{
private LogicFunction $lf; // logic function
private string $output_variable; // output variable
public function __construct(string $type, array $a = null)
{
parent::__construct($type, $a);
if (isset($a["function"])) { // fetching from a JSON-stored object
$this->lf = LogicFunction::fromArray($a["function"]);
} else if (isset($a["expression"], $a["input_variables"])) { // building from the scratch
$this->lf = new LogicFunction($a["expression"], $a["input_variables"]);
} else {
$this->lf = new LogicFunction();
}
$this->output_variable = $a["output_variable"] ?? "f";
}
public function setOutputVariable(string $ovar): void {
$this->output_variable = $ovar;
}
public function getOutputVariable(): string {
return $this->output_variable;
}
public function setLogicFunction(LogicFunction $lf): void {
$this->lf = $lf;
}
public function getLogicFunction(): LogicFunction {
return $this->lf;
}
protected function getTTDiffCntToCA(string $ott): int {
$cans_tt = $this->getTruthTable();
$errs = 0;
for ($i = 0; $i < $this->getLogicFunction()->getNStates(); $i++) {
if (($ott[$i] ?? " ") != $cans_tt[$i]) {
$errs++;
}
}
return $errs;
}
public function toArray(string $mode = "all"): array
{
$a = parent::toArray($mode);
if ($mode === "all") {
$a["function"] = $this->lf->toArray();
}
$a["output_variable"] = $this->output_variable;
$a["input_variables"] = $this->lf->getInputVars();
return $a;
}
public function randomize(): void
{
parent::randomize();
if ($this->hasFlag("drawnetwork")) {
$this->setImageData($this->lf->drawNetwork($this->output_variable));
$this->setImageType("html");
}
}
// ---- Lua specific ----
public function generateRandomFunction(array $input_vars, int $min_depth, int $max_depth): void {
$this->lf = LogicFunction::genRandom(LuaUtils::l2pA($input_vars), $min_depth, $max_depth);
}
public function generateRandomDF(array $input_vars): void {
$this->lf = LogicFunction::genRandomDNF(LuaUtils::l2pA($input_vars));
}
public function setLogicFunctionExpr(string $expr, array $input_vars = []): void {
$this->lf = new LogicFunction($expr, LuaUtils::l2pA($input_vars));
}
public function getLogicFunctionExpr(string $fmt = "verilog_bitwise"): string {
return $this->lf->getExpression($fmt);
}
public function getLogicFunctionDNF(): string {
return $this->lf->toDNF();
}
public function getTruthTable(): string {
return $this->lf->getTruthTable();
}
}