ring_elem RingZZ::power(const ring_elem f, mpz_t n) const { mpz_ptr result = new_elem(); int n1; if (!get_si(n1, n)) { ERROR("exponent too large"); } else mpz_pow_ui(result, f.get_mpz(), n1); return ring_elem(result); }
void ay31015_device::rx_process() { switch (m_rx_state) { case PREP_TIME: // assist sync by ensuring high bit occurs m_rx_pulses--; if (get_si()) m_rx_state = IDLE; return; case IDLE: m_rx_pulses--; if (!get_si()) { m_rx_state = START_BIT; m_rx_pulses = 16; } return; case START_BIT: m_rx_pulses--; if (m_rx_pulses == 8) // start bit must be low at sample time { if (get_si()) m_rx_state = IDLE; } else if (!m_rx_pulses) // end of start bit { m_rx_state = PROCESSING; m_rx_pulses = m_total_pulses; m_rx_bit_count = 0; m_rx_parity = 0; m_rx_data = 0; } return; case PROCESSING: m_rx_pulses--; if (!m_rx_pulses) // end of a byte { m_rx_pulses = 16; if (m_control_reg & CONTROL_NP) // see if we need to get a parity bit m_rx_state = FIRST_STOP_BIT; else m_rx_state = PARITY_BIT; } else if (!(m_rx_pulses & 15)) // end of a bit m_rx_bit_count++; else if ((m_rx_pulses & 15) == 8) // sample input stream { m_internal_sample = get_si(); m_rx_parity ^= m_internal_sample; // calculate cumulative parity m_rx_data |= m_internal_sample << m_rx_bit_count; } return; case PARITY_BIT: m_rx_pulses--; if (m_rx_pulses == 8) // sample input stream { m_rx_parity ^= get_si(); // calculate cumulative parity } else if (!m_rx_pulses) // end of a byte { m_rx_pulses = 16; m_rx_state = FIRST_STOP_BIT; if ((!(m_control_reg & CONTROL_EPS)) && (m_rx_parity)) m_rx_parity = 0; // odd parity, ok else if ((m_control_reg & CONTROL_EPS) && (!m_rx_parity)) m_rx_parity = 0; // even parity, ok else m_rx_parity = 1; // parity error } return; case FIRST_STOP_BIT: m_rx_pulses--; if (m_rx_pulses == 8) // sample input stream m_internal_sample = get_si(); else if (m_rx_pulses == 7) // set error flags { if (!m_internal_sample) { m_status_reg |= STATUS_FE; // framing error - the stop bit not high m_rx_state = PREP_TIME; // lost sync - start over // return; } else m_status_reg &= ~STATUS_FE; if ((m_rx_parity) && (!(m_control_reg & CONTROL_NP))) m_status_reg |= STATUS_PE; // parity error else m_status_reg &= ~STATUS_PE; if (m_status_reg & STATUS_DAV) m_status_reg |= STATUS_OR; // overrun error - previous byte still in buffer else m_status_reg &= ~STATUS_OR; m_rx_buffer = m_rx_data; // bring received byte out for computer to read update_status_pins(); } else if (m_rx_pulses == 6) { m_status_reg |= STATUS_DAV; // tell computer that new byte is ready update_status_pins(); } else if (m_rx_pulses == 4) { if (m_second_stop_bit) { /* We should wait for the full first stop bit and the beginning of the second stop bit */ m_rx_state = SECOND_STOP_BIT; m_rx_pulses += m_second_stop_bit - 7; } else { /* We have seen a STOP bit, go back to PREP_TIME */ m_rx_state = PREP_TIME; } } return; case SECOND_STOP_BIT: m_rx_pulses--; if (!m_rx_pulses) m_rx_state = PREP_TIME; return; } }
int JsonValue::getInt() const { auto val = getValue(); if (!value.fits_sint_p()) throw std::logic_error("Value too large for an int"); return val.get_si(); }