From d68040d87385c360719e35941ad4f0112d9d0c03 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Sun, 30 Aug 2020 08:52:55 +0200 Subject: Fixes random number in choice generation. --- .../v1/compiler/fate/v1/ComputationCompiler.java | 111 ++++++++++++++++++++- .../v1/compiler/fate/v1/InstructionCompiler.java | 41 ++++++++ .../wyrd/v1/compiler/fate/v1/SequenceCompiler.java | 13 +++ .../compiler/util/registers/RegisterManager.java | 19 +++- 4 files changed, 180 insertions(+), 4 deletions(-) (limited to 'src/core') diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 94e013d..f30d433 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -22,6 +22,7 @@ import tonkadur.wyrd.v1.lang.instruction.SetPC; import tonkadur.wyrd.v1.compiler.util.BinarySearch; import tonkadur.wyrd.v1.compiler.util.IfElse; import tonkadur.wyrd.v1.compiler.util.If; +import tonkadur.wyrd.v1.compiler.util.RemoveAt; import tonkadur.wyrd.v1.compiler.util.IterativeSearch; import tonkadur.wyrd.v1.compiler.util.CountOccurrences; @@ -949,8 +950,114 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ) ) { - result_as_computation = - Operation.rand(operands.get(0), operands.get(1)); + final List push_rand, pop_rand; + final Register result, zero_holder; + + push_rand = new ArrayList(); + pop_rand = new ArrayList(); + + result = reserve(Type.INT); + zero_holder = reserve(Type.INT); + + result_as_computation = result.get_value(); + result_as_address = result.get_address(); + + push_rand.add + ( + new SetValue + ( + result_as_address, + Operation.rand(operands.get(0), operands.get(1)) + ) + ); + + push_rand.add + ( + new SetValue + ( + new RelativeAddress + ( + compiler.registers().get_rand_value_holder().get_address(), + new Cast + ( + new Size + ( + compiler.registers().get_rand_value_holder + ( + ).get_address() + ), + Type.STRING + ), + Type.INT + ), + result_as_computation + ) + ); + + pop_rand.add + ( + new SetValue + ( + result_as_address, + new ValueOf + ( + new RelativeAddress + ( + compiler.registers().get_rand_value_holder().get_address(), + new Cast(Constant.ZERO, Type.STRING), + Type.INT + ) + ) + ) + ); + + pop_rand.add(new SetValue(zero_holder.get_address(), Constant.ZERO)); + + pop_rand.add + ( + RemoveAt.generate + ( + compiler.registers(), + compiler.assembler(), + zero_holder.get_address(), + new Size + ( + compiler.registers().get_rand_value_holder().get_address() + ), + compiler.registers().get_rand_value_holder().get_address() + ) + ); + + init_instructions.add + ( + IfElse.generate + ( + compiler.registers(), + compiler.assembler(), + Operation.equals + ( + compiler.registers().get_rand_mode_holder().get_value(), + Constant.ZERO + ), + new SetValue + ( + result_as_address, + Operation.rand(operands.get(0), operands.get(1)) + ), + IfElse.generate + ( + compiler.registers(), + compiler.assembler(), + Operation.equals + ( + compiler.registers().get_rand_mode_holder().get_value(), + Constant.ONE + ), + compiler.assembler().merge(push_rand), + compiler.assembler().merge(pop_rand) + ) + ) + ); } else if ( diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 42df895..4672f21 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -1379,6 +1379,29 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); + result.add + ( + new SetValue + ( + compiler.registers().get_rand_mode_holder().get_address(), + new Constant(Type.INT, "0") + ) + ); + + result.add + ( + Clear.generate + ( + compiler.registers(), + compiler.assembler(), + new Size + ( + compiler.registers().get_rand_value_holder().get_address() + ), + compiler.registers().get_rand_value_holder().get_address() + ) + ); + compiler.registers().push_hierarchical_instruction_level(); for ( @@ -1422,6 +1445,15 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.assembler().push_context_label("choices", end_of_choices_label); + result.add + ( + new SetValue + ( + compiler.registers().get_rand_mode_holder().get_address(), + new Constant(Type.INT, "1") + ) + ); + result.add ( compiler.assembler().mark_after @@ -1466,6 +1498,15 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); + result.add + ( + new SetValue + ( + compiler.registers().get_rand_mode_holder().get_address(), + new Constant(Type.INT, "-1") + ) + ); + result.add ( compiler.assembler().mark_after diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index fb3119d..cf23045 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -8,6 +8,9 @@ import tonkadur.wyrd.v1.lang.meta.Instruction; import tonkadur.wyrd.v1.lang.World; import tonkadur.wyrd.v1.lang.Register; +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.computation.Constant; public class SequenceCompiler { /* Utility Class */ @@ -122,6 +125,16 @@ public class SequenceCompiler ic = new InstructionCompiler(compiler); + compiler.assembler().handle_adding_instruction + ( + new SetValue + ( + compiler.registers().get_rand_mode_holder().get_address(), + Constant.ZERO + ), + compiler.world() + ); + for ( final tonkadur.fate.v1.lang.meta.Instruction fate_instruction: diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java index 8af7754..653fcbe 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java @@ -37,17 +37,22 @@ public class RegisterManager protected final Map context_by_name; protected final Deque context; protected final RegisterContext base_context, parameter_context; - protected final Register next_pc, pc_stack, choice_number; + protected final Register next_pc, pc_stack; + protected final Register choice_number, rand_mode, rand_value; protected int created_contexts; public RegisterManager () { base_context = new RegisterContext("base context"); parameter_context = new RegisterContext("parameter context", ".param."); + next_pc = base_context.reserve(Type.INT); - choice_number = base_context.reserve(Type.INT); pc_stack = base_context.reserve(new MapType(Type.INT)); + choice_number = base_context.reserve(Type.INT); + rand_mode = base_context.reserve(Type.INT); + rand_value = base_context.reserve(new MapType(Type.INT)); + context_by_name = new HashMap(); context = new ArrayDeque(); created_contexts = 0; @@ -75,6 +80,16 @@ public class RegisterManager return choice_number; } + public Register get_rand_mode_holder () + { + return rand_mode; + } + + public Register get_rand_value_holder () + { + return rand_value; + } + public void create_stackable_context (final String context_name) { final StackableRegisterContext result; -- cgit v1.2.3-70-g09d2