from .manufacturing_yield_scrap_types import YieldPlan from .math_round_div import round_div MAX_OUTPUT = (2**53 - 1) // 10000 def input_for_yield(required_output: int, yield_basis_points: int) -> YieldPlan: """Starts needed for a good output at a yield, rounded up in integers so an exact answer (95 at 95% is 100) never becomes 101 through a float. """ if ( isinstance(required_output, bool) or not isinstance(required_output, int) or required_output < 0 or required_output > MAX_OUTPUT ): raise ValueError( "requiredOutput must be a whole number of units from 0 to %d, received %r" % (MAX_OUTPUT, required_output) ) if ( isinstance(yield_basis_points, bool) or not isinstance(yield_basis_points, int) or yield_basis_points < 1 or yield_basis_points > 10000 ): raise ValueError("yieldBasisPoints must be a whole number from 1 to 10000, received %r" % (yield_basis_points,)) input_units = round_div(required_output * 10000, yield_basis_points, "up") return YieldPlan(input=input_units, scrap=input_units - required_output)