public Acceleration(ValBus input_pos1, ValBus input_pos2, ValBus magnitude_output) { this.input_pos1 = input_pos1; this.input_pos2 = input_pos2; this.mag_output = magnitude_output; // Constants double MASS_OF_ARGON = 39.948; // Constant processes var const_mass_of_argon = new Constants(MASS_OF_ARGON); // Calculation processes var sub = new Sub(); // TODO: Add calculations for more dimensions Force force = new Force(mag_output); // Piping sub.difference through magnitude var magnitude_pipe = new nPipe((long)Deflib.Magnitude_depth.n); // Piping sub.difference through force var force_pipe = new nPipe((long)Deflib.Force_depth.n); var mul = new Mul(); var div_mass = new Div(); sub.minuend = input_pos2; sub.subtrahend = input_pos1; // magnitude calculation mag_input = sub.difference; // pipe sub.difference through magnitude magnitude_pipe.first.input = sub.difference; // pipe sub.difference through force force_pipe.first.input = magnitude_pipe.last.output; mul.multiplicant = force.output; mul.multiplier = force_pipe.last.output; div_mass.divident = mul.product; div_mass.divisor = const_mass_of_argon.output; output = div_mass.quotient; }
public Magnitude() { input_procs = new Mul[(int)Deflib.Dimensions.n]; for (int i = 0; i < (int)Deflib.Dimensions.n; i++) { input_procs[i] = new Mul(); } var add = new Add(); var sqrt = new Sqrt(); add.addend = input_procs[0].product; add.augend = input_procs[1].product; sqrt.input = add.sum; output = sqrt.output; }
public Update_position(ValBus prev_data_point, ValBus velocity_data_point, double timestep) { this.prev_data_point = prev_data_point; this.velocity_data_point = velocity_data_point; // Constants var const_timestep = new Constants(timestep); // Calculation processes var mul = new Mul(); var add = new Add(); var pipe = new PipelineRegister(); mul.multiplicant = velocity_data_point; mul.multiplier = const_timestep.output; pipe.input = prev_data_point; add.augend = mul.product; add.addend = pipe.output; updated_data_point = add.sum; }
public MD(ulong data_size, double timestep_size, ValBus mag_output) { // RAM var position_ram = new TrueDualPortMemory <ulong>((int)data_size); var velocity_ram = new TrueDualPortMemory <ulong>((int)data_size); var acceleration_ram = new AccelerationDataRam(data_size); //External simulation process var external_simulator = new External_MD_Sim(data_size, timestep_size, (ulong)Cache_size.n); // Connect External_MD_Simulation field with simulation proccess sim = external_simulator; // Managers var acceleration_manager = new Acceleration.Acc_manager(); var velocity_manager = new Velocity_Update.Vel_manager(data_size, timestep_size); var position_manager = new Position_Update.Pos_manager(data_size, timestep_size); // Multiplexers var init_pos_data_multiplexer = new Multiplexer_ControlA(); var pos_data_multiplexer = new Multiplexer_ControlA(); var velocity_data_multiplexer = new Multiplexer_ControlB(); var position_update_multiplexer = new Multiplexer_ControlB(); var velocity_update_multiplexer = new Multiplexer_ControlA(); // Cache var acceleration_cache = new Cache.AccelerationCache((ulong)Cache_size.n); // Acceleration class Acceleration.Acceleration acceleration = new Acceleration.Acceleration(acceleration_manager.pos1_output, acceleration_manager.pos2_output, mag_output); // Connect Acceleration field with acceleration process acc = acceleration; // Velocity class Velocity_Update.Update_velocity velocity = new Velocity_Update.Update_velocity(velocity_manager.prev_velocity, velocity_manager.acceleration_data_point, timestep_size); // Position class Position_Update.Update_position position = new Position_Update.Update_position(position_manager.prev_position, position_manager.velocity_data_point, timestep_size); // Connections external_simulator.position_ramctrl = init_pos_data_multiplexer.first_input; acceleration_manager.pos1_ramctrl = init_pos_data_multiplexer.second_input; init_pos_data_multiplexer.output = pos_data_multiplexer.first_input; position_manager.position_ramctrl = pos_data_multiplexer.second_input; pos_data_multiplexer.output = position_ram.ControlA; acceleration_manager.pos2_ramctrl = position_update_multiplexer.first_input; position_manager.updated_position_ramctrl = position_update_multiplexer.second_input; position_update_multiplexer.output = position_ram.ControlB; acceleration_manager.pos1_ramresult = position_ram.ReadResultA; external_simulator.position_ramresult = position_ram.ReadResultA; position_manager.position_ramresult = position_ram.ReadResultA; acceleration_manager.pos2_ramresult = position_ram.ReadResultB; acceleration_manager.ready = external_simulator.acc_ready; acceleration_cache.acceleration_input = acceleration.output; acceleration_cache.ready = acceleration_manager.acceleration_ready_output; acceleration_cache.acc_ramctrl = acceleration_ram.ControlA; acceleration_cache.acc_ramresult = acceleration_ram.ReadResultA; velocity_manager.acceleration_data_point_ramctrl = acceleration_ram.ControlB; velocity_manager.acceleration_data_point_ramresult = acceleration_ram.ReadResultB; velocity_manager.data_ready = acceleration_cache.output; velocity_manager.updated_velocity = velocity.updated_data_point; velocity_manager.velocity_ramctrl = velocity_data_multiplexer.first_input; position_manager.velocity_data_point_ramctrl = velocity_data_multiplexer.second_input; velocity_data_multiplexer.output = velocity_ram.ControlB; velocity_manager.velocity_ramresult = velocity_ram.ReadResultB; velocity_manager.updated_velocity_ramctrl = velocity_update_multiplexer.second_input; external_simulator.init_velocity_ramctrl = velocity_update_multiplexer.first_input; velocity_update_multiplexer.output = velocity_ram.ControlA; position_manager.velocity_data_point_ramresult = velocity_ram.ReadResultB; velocity_manager.reset = external_simulator.velocity_reset; position_manager.data_ready = velocity_manager.finished; position_manager.reset = external_simulator.position_reset; position_manager.updated_position = position.updated_data_point; position.prev_data_point = position_manager.prev_position; position.velocity_data_point = position_manager.velocity_data_point; external_simulator.finished = position_manager.finished; }
public Testing_Simulation(ulong data_size, ValBus input) { this.data_size = (uint)data_size; this.input = input; }
public Force(ValBus input) { this.input = input; // Constants double SIGMA = 3.4; double EPSILON = 0.0103; double TWELVE = 12.0; double SIX = 6.0; double FOURTEEN = 14.0; double EIGHT = 8.0; double FOURTYEIGHT = 48.0; double TWENTYFOUR = 24.0; double FOUR = 4.0; // Constant processes var const_sigma = new Constants(SIGMA); var const_epsilon = new Constants(EPSILON); var const_twelve = new Constants(TWELVE); var const_six = new Constants(SIX); var const_fourteen = new Constants(FOURTEEN); var const_eight = new Constants(EIGHT); var const_fourtyeight = new Constants(FOURTYEIGHT); var const_twentyfour = new Constants(TWENTYFOUR); var const_four = new Constants(FOUR); // Calculation processes // (48*eps*(sig^12/r^14)) - (24*eps*(sig^6/r^8)) var abs_sigma = new Abs(); var ln_sigma = new Ln(); var abs_r = new Abs(); var ln_r = new Ln(); var mul12 = new Mul(); var mul6 = new Mul(); var mul14 = new Mul(); var mul8 = new Mul(); var exp12 = new Exp(); var exp6 = new Exp(); var exp14 = new Exp(); var exp8 = new Exp(); var div_12_14 = new Div(); var div_6_8 = new Div(); var mul_eps_12_14 = new Mul(); var mul_eps_6_8 = new Mul(); var mul_48 = new Mul(); var mul_24 = new Mul(); var sub = new Sub(); /* NOTE: e^{x*ln(b)} == b^x*/ abs_r.input = input; abs_sigma.input = const_sigma.output; ln_r.input = abs_r.output; ln_sigma.input = abs_sigma.output; mul12.multiplicant = const_twelve.output; mul12.multiplier = ln_sigma.output; mul6.multiplicant = const_six.output; mul6.multiplier = ln_sigma.output; exp12.input = mul12.product; exp6.input = mul6.product; mul14.multiplicant = const_fourteen.output; mul14.multiplier = ln_r.output; mul8.multiplicant = const_eight.output; mul8.multiplier = ln_r.output; exp14.input = mul14.product; exp8.input = mul8.product; div_12_14.divident = exp12.output; div_12_14.divisor = exp14.output; div_6_8.divident = exp6.output; div_6_8.divisor = exp8.output; mul_eps_12_14.multiplicant = const_epsilon.output; mul_eps_12_14.multiplier = div_12_14.quotient; mul_eps_6_8.multiplicant = const_epsilon.output; mul_eps_6_8.multiplier = div_6_8.quotient; mul_48.multiplicant = const_fourtyeight.output; mul_48.multiplier = mul_eps_12_14.product; mul_24.multiplicant = const_twentyfour.output; mul_24.multiplier = mul_eps_6_8.product; sub.minuend = mul_48.product; sub.subtrahend = mul_24.product; output = sub.difference; }